Loading

DE_aemmprty 的草稿纸(2025.7.23 ~ 2025.7.28)

2025.7.23

Majority

关键启发:考虑分组时,思路打开。我们只需要组内有规律 / 性质。(比如 \(0, 1\) 不一定要整个连通块压入组内)

\(s_i = 2 \times \sum_{k = 1}^i a_k - i\),则 \(s_i - s_{j - 1} \geq 2\)。但 \(s_i\) 显然犹如一坨,弃掉。

从操作考虑没什么前途。考虑 \(1\) 连通块。显然左端点是 \(1\) 左端点,右端点是 \(1\) 右端点。

考虑 \(0\) 连通块周围。没救。直接考虑 DP?没救。

观察操作形态。操作应当是一个树形结构。每次操作对应着一些 \(0 \to 1\)。因此,能否区间 DP?没救。

考虑压缩连通块成大小,\(1\) 连通块与左边的 \(0\) 合并。对于一个 \(1\) 连通块,\(\sum_{k = i}^j b_k + a_{j + 1} \geq 0\)

感觉不如将 \(0\) 视为 \(-1\),然后和 \(\geq 0\)

逆向考虑。

\[f_{i, j, 0} = \sum_{k = 0}^{i - 1} f_{k, i - j - k, 1}\\ f_{i, j, 1} = \sum_{x = j + 1}^{i} f_{i - j, x, 0} \times g(j) \]

如何求 \(g(j)\)

\[g(j) = \sum_{x = 0}^n f_{j, x, 0} + f_{j, x, 1} \]

\(g(j)\) 未计算?为什么要保留全 \(1\)?因为全 \(1\) 后面有 \(0\)。能否通过分组直接绑定 \(0,1\)

考虑把左边 \(i\)\(0\),中间 \(i\)\(1\),右边 \(i\)\(0\) 绑到一起。一定不重不漏。消除了限制。因此降维,转移 naive。

2025.7.24

*[AGC067B] Modifications

关键点是观察角度应该是序列本身,而不是染色染成同样情况的判定。

区间覆盖后求染色本质不同。倒着做。转化为覆盖了就不能再变色。1

颜色显然是嵌套的形式。1.5

考虑什么情况会本质相同。先考虑简单的情况。如果这感觉不好考虑。

考虑如何处理区间为排列。

能否把非法情况容斥?考虑当前 \(i \in S, a_i\) 被钦定的方案数为 \(f(S)\),则 \(\sum\limits_{\emptyset \neq S}\) 对于原问题,直接容斥是不好做的。

是否是存在区间区间没有贡献时会重复?不是。

考虑颜色交集 / 并集(两个颜色的关系)这道题的重复太复杂了,从染色角度出发不可做。


由于 1.5,考虑区间 DP。2

算序列能否被全部覆盖不太好做。为啥呢?太容易重复了,还不好加规则。老套路,考虑容斥,\(f_{l, r}\) 表示只考虑所有 \([L_i, R_i]\)\([l, r]\) 内的区间,完全不能操作的序列数。3

考虑不能操作的区间的结构。容易发现,它的结构是若干个没有被覆盖的点构成的。

考虑进行 DP。设 \(g_{i, j, k}\) 表示左端点为 \(i\),当前没被覆盖的点为 \(j\),上一个和 \(j\) 颜色不同的没被覆盖的点为 \(k\)

可以进行转移。

涛涛的 gcd

要么是调和级数,要么是求每个 \(a_i\) 的因子。

\(\mathcal{O}(nV)\) 做法是考虑离线,对于每个 \(l\),扫描线,记录每个数的出现次数。由于每个数出现 \(> 1\) 次后没有用,因此复杂度正确。

\(\mathcal{O}(n\sqrt{n}\log n)\) 做法是对于每个 \(a_i\) 的因子 \(x\),求 \(lst\) 表示前面最右边与他相等的因子下标,和 \(pos\) 表示他自己的下标。典型的二位数点,离线后 BIT 扫描线。(也可以回滚莫队)

如果存在两个因子 \(x, y\)\(lst_x \leq lst_y\)\(pos_x \geq pos_y\)\(x < y\),则 \(x\) 全面劣于 \(y\)

因此,注意到固定 \(l\) 时,右边真正有效的只有 \(\mathcal{O}(n)\) 个值,而对于每个 \(x\),他的因子中只有一个有效。

进一步观察,\(x\) 的最优决策点随着 \(l\) 的增加单调不增,具有决策单调性。

所以可以 \(\mathcal{O}(n\sqrt{n}\log{n})\) 但是常数极小地解决此题。瓶颈在于 \(x\) 决策点更新。大概 \(1.6 \times 10^8\) 计算量。

*七管荧光灯

[!WARNING]
这道题菜逼博主还不会

考虑打表。打表的话,我们需要保证每次的连通块,如果有 \(4\),则不能出现 \(\{1, 2, 3, 4\}\)\(\{4, 5, 6, 7\}\);如果没有 \(4\),则不能出现 \(6\) 条边。根据这个写 dfs 来计算 SG。写个但!!!

弱化题目打表。考虑 \(l_4 = r_4 = 0\)。则容易发现如果所有石子数相等,则先手必输,否则必胜。考虑容斥,我们算先手必输的方案数,即 \((\bigcap\limits_{1\leq i \leq 7, i \neq 4} [l_i, r_i]) ^ 6\)

  • \(1,2,3,5,6,7\) 相等,\(a_4 > 0\) 必胜,否则必输。

  • \(1,2,3\) 有最小值,\(5,6,7\) 有最小值,必胜。

嗯想没救。\(a_4 = 0\),全部相等必输。\(a_4 = 1\)

  • \(1 \ 1 \ 1 \ 1 \ 1 \ 1\):必胜
  • \(1 1 1 1 ???\)\(???1111\):必胜

[ARC130D] Zigzag Tree

弱化题目,观察链。链上是 \(f_{i, j}\) 表示前 \(i\) 个,第 \(i\) 个数的排名是 \(j\)

观察菊花。发现对于一个点的若干儿子,每对都是同一种类型1。答案为 \(2(n - 1)!\)

回到原题。1 的结论在每个节点都能使用。考虑树上 DP。

\(f_{i, j, 0/1}\) 表示对于 \(i\) 的子树,\(p_i\) 在子树中排名为 \(j\),且 \(p_i\) 大于 / 小于相邻节点的 \(p_i\)。 设 \(g_{i, j, 0/1}\) 表示对于 \(i\) 的子树,不算 \(p_i\),儿子排名最高 / 最低为 \(j\)。转移是 naive 的。

序列妙妙值

如果对于所有数分成两部分没有前途,把每个数拆成两部分也是可以的。

直接考虑似乎没什么前途。两种思路:

  • 充分利用前缀信息计算后续信息
  • 优先观察式子性质 \(\to\) 能解决 \(k = 2\),但似乎扩展不了,部分分也没给。没前途。

考虑先来朴素 DP。设 \(f_{i, j}\) 表示前 \(i\) 个分了 \(j\) 组,有 \(f_{i, j} = \sum_{k = 1}^i f_{k, j - 1} + (s_i \oplus s_k)\)1


发现题面好像对值域情有独钟,观察对象设为值域。2

发现值域很小的时候,我们可以枚举 \(s_k\),复杂度 \(\mathcal{O}(nkV)\)

拆位?\(f_{i, j} = \sum_{k = 1}^i f_{k, j - 1} + (a_i \oplus a_k) \, | \, (b_i \oplus b_k)\)

枚举 \(b_k\)。假设当前考虑的是后八位为 \(x\) 的数。

提前预处理出 \(g_{k, j, A, B} = f_{k, j} + (a_k \oplus A)\),其中 \(b_k = B\)。由于每个 \(f_{k, j}\) 只需要记录 \(\sqrt{V}\) 次,所以复杂度为 \(\mathcal{O}(nk\sqrt{V})\)

\(l_{k, j, A, B} = \min\limits_{i=1}^k g_{i, j, A, B}\),则 \(f_{i, j} = \sum\limits_{x = 0}^{\sqrt{V}} l_{i - 1, j, a_i, x} \, | \, x\)。复杂度为 \(\mathcal{O}(nk\sqrt{V})\)

实际实现时,\(g, l\) 的第一维可以优化掉。

*[ARC145D] Non Arithmetic Progression Set

[!WARNING]

考虑将 \(y - x \neq z - y\) 转化为 \(x + z \neq 2y\),二进制不太好构造,考虑三进制。

题目限制很松。显然可以自己加条件。

有一个很显然的构造就是 \(2^0, 2^1, 2^2, \cdots 2^{n - 1}\)。太大了。为什么?浪费太多了。

一些可以尝试的方向是二进制,模数,质数,等差数列。

题目显然问你的是构造不存在长度为 \(3\) 的等差数列且和一定的序列。

也可以描述成不存在两个数,他们的平均数存在。

从奇偶出发?

Subset with Zero Sum

思路唯一有效的部分是将 \(a_i\) 转化为 \(a_i + n - i\)


对于一个环,\(\sum (u_i - v_i) = 0\)。因此考虑建图。

\(a_i\) 转化为 \(i - a_i\),然后 \(i \to i - a_i\),由于 \((u_i - v_i) = i - i + a_i = a_i\),所以找环即可!

2025.7.25

Armor and Weapons

弱化题目后变成没有 \((i, j)\) 点对。发现时间是 \(\log{n}\) 量级的(Fibonnaci 数列)。

每次一定取最大的两个 \(x, y\) 加起来。如果存在 \((x, y)\) 点对,则大小 \(+1\)

尝试(注意是尝试)DP。设 \(f_{i, j}\) 表示前 \(i\) 秒,盔甲的最高等级为 \(j\),武器的最高等级。

\(g(x, y)\) 表示 \(x, y\) 的 power,则有:

\[f_{i, j} = g(j, f_{i - 1, j})\\ f_{i, j} = \max_{k = 1}^{j - 1} \{[g(k, f_{i - 1, k}) \geq j]f_{i - 1, k}\} \]

时间复杂度 \(\mathcal{O}(n\log n)\)

Odd Mineral Resource

适当随机可以简化题目条件。在这里面有很多技巧。

首先,可以把路径转化成 \(d_u + d_v - [a_{\text{lca}} = x]\)


这是一个经典的 trick。

对每个颜色判断,条件比较严格,不使用 \(\sqrt{n}\) 不太可做。

如何弱化条件?我们使用随机大法。

给每一种颜色随机赋权,然后如果一条路径上异或和等于 \(0\),我们就说不存在合法的 \(x\)

主席树维护每个点,颜色区间的异或值。然后在主席树上二分即可。

注意讨论 \(a_{\text{lca}}\)

Swedish Heroes

有时候果断地转化和过多的性质反而会模糊题目的结论。不要丢掉其他性质和可能更深刻的刻画。

长成一个树形结构。最大值显然是 \(\sum\limits_{i = 1}^n |a_i|\)。我们要尽量减少负数 + 正数的情况,这样太浪费了。我们也要避免最终值是一个负数。

序列最终 \(\times 1\)\(\times -1\) 有什么规律吗?有归纳规律。考虑小情况。

打表后发现 \(+\) 的数量有规律,研究一下发现:

  • \(2p + q \equiv 0 \pmod{3}\)
  • 一定存在相邻两个符号相等。

证明使用归纳法显然。


后记:为什么考虑使用 \(3\) 为模数?我们尝试不使用打表解决此题。

显然,序列长成一颗二叉树的结构。 但从二叉树上考虑会弱化序列上两个数“合并”的信息。

将观察对象设为一次合并,先考虑简单情况,如果两个正数相加 \(\to\) 一个负数,两个负数相加 \(\to\) 一个正数,此时负数个数 \(+ 3\)\(-3\),正数个数 \(-3\)\(+3\)。就是这里启发了我们考虑 \(3\) 作为模数。

[AGC055B] ABC Supremacy

考虑操作之间的结构是本题的突破点。

操作是无向的。所以一定有对于每一种字符串的赋值方法,使得一个连通块中的字符串在同一类中。考虑寻找分类方法和赋值方法。

考虑 \(ABC\) 之间有没有什么分界点。发现对于一个 \(ABC\),它可以推土机!所以没有分界点。推出来后,在末尾的和在开头的是一样的。这启示我们考虑 \(s, t\) 删除一个 \(ABC\) 状物,然后如果相等则能互相转换。

[AGC066C] Delete AAB or BAA

[!WARNING]

此题正解请左拐 Delete AAB or BAA - DE_aemmprty - 博客园

CF1458C Latin Square

我们一般处理序列询问时,都是考虑从 \(1\)\(n\) 来考虑 \(a_1, \cdots, a_n\),这种方法的好处是便于维护 \([l, r]\) 的区间信息,便携地描述了序列在 \(pos\) 从小到大时相对的关系。但是,这不是必要的!我们常常忽略这一点!

如果只有 UDLR,可以维护一个行排列和列排列,然后输出时转一下即可。

加入了 IC 后,怎么办?


神题,我懂得欣赏。

这题给我们很大的启示是:我们一般处理序列询问时,都是考虑从 \(1\)\(n\) 来考虑 \(a_1, \cdots, a_n\),这种方法的好处是便于维护 \([l, r]\) 的区间信息,便携地描述了序列在 \(pos\) 从小到大时相对的关系。但是,这不是必要的!我们常常忽略这一点!

这道题告诉了我们,数组的 \(pos\) 不一定要从小到大排!当值与下标有密切联系的时候,再对 \(i\) 按顺序排列反而不优!我们可以单纯将一个数组中的值视为一个二元组 \((i, a_i)\)

在这道题中,下标的按顺序排列不重要。我们可以考虑 \((i, j, k)\) 表示第 \(i\) 行第 \(j\) 列的值是 \(k\)。这样的二元组有 \(n^2\) 个。

我们考虑 UDLR 是什么。显然,对于一个三元组 \((i, j, k)\),这四个操作分别是:

  • \((i,j,k)\to \Big((i + 1) \bmod n + 1, j, k\Big)\)
  • \((i, j, k)\to \Big((i - 1) \bmod n + 1, j, k\Big)\)
  • \((i, j, k)\to \Big(i, (j + 1) \bmod n + 1, k\Big)\)
  • \((i, j, k) \to \Big(i, (j - 1) \bmod n + 1, k\Big)\)

然后考虑 IC 表示什么。我们发现它尽然是这样!

  • \((i, j, k) \to (i, k, j)\)
  • \((i, j, k) \to (k, j, i)\)

因此我们打 tag 维护即可!

2025.7.26

FFT 学习笔记

[!WARNING]

左转博客园 FFT 学习笔记 - DE_aemmprty - 博客园

「MCOI-07」Dream and More Discs

能不能先考虑如果我们知道所有重要值,如何快速求出第 \(k\) 小的那个值。

我们可以对外面二分,对里面每个值来二分,询问次数是 \(nm\log V = 9350\),很劣。

但是其实我们可以直接查询出重要值,我们只用这个值判断与 \(mid\) 的大小关系,很浪费。

其实很多没用,然后复杂度就对了。

*ABC 416 G

[!WARNING]

这道题还没有完全理解

发现这个长度很奇怪啊!

2025.7.27

前缀值

[!WARNING]

完整正解右转博客园。启发:枚举点不好算时,考虑为什么不好算(得到了哪些信息 / 不知道哪些信息)

如果当前 \(mx \geq mn\),对于后面的序列,就是 \(> mx\) 的求最长上升,\(< mn\) 的求最长下降。

如果 \(mx < mn\),一个 \(a_i < mx\) 归到了 \(mn\) 或者一个 \(a_i > mn\) 归到了 \(mx\),变成第一种情况。

考虑弱化题目。假设全部递增,显然是 \(n\) 个。最长下降为 \(2\) 怎么做?不会啊,\(\mathcal{O}(n^2)\) 都不会就开始做最后 sub 了。

能不能 \(\mathcal{O}(n^2)\) 啊。发现第二行的结论在两边都可以扩展。所以前面不需要直接硬 DP。

暴力 DP 是 \(f_{i, j, k}\) 的,转移 naive。枚举分界点,条件是 \(pmx < pmn < x\)\(x < pmx < pmn\)

  • \(pmx < pmn < x\),则前面 \(\leq pmx\) 的最长上升,\(\geq pmn\) 的最长下降,后面 \(> x\) 的最长上升,\(< pmn\) 的最长下降,答案为四个数的和 \(+1\)
  • \(x < pmx < pmn\),则前面 \(\leq pmx\) 的最长上升,\(\geq pmn\) 的最长下降,后面 \(> pmx\) 的最长上升,\(< x\) 的最长下降,答案为四个数的和 \(+1\)

看起来复杂度没有任何变化,还是 \(\mathcal{O}(n^3)\),瓶颈在枚举 \(x, pmx, pmn\)

不对,两边并不是对称的。奇了怪了。假设左边第一个数比较中间,选哪里都不优,但它却必须要选。能不能简单的修 BUG?似乎不行。G 了。回退回退。

问题的本质还是出在“每个数恰好分到一个地方”这里,每个数有用还是没用是确定的,这个限制太抽搐了。正着难做,能不能倒着做?倒着的话,似乎我们可以决定一个数是有用还是没用?显然不行啊,我先冷静一下。

好像也不一定不行。倒着使我们发现了一个性质:如果枚举了分界点的 \(pmx, pmn\),则前面的最优策略其实是固定的。具体来说,我们从前往后,如果一个数 \(\leq pmx\),它必须被归到 \(mx\) 中,\(pmn\) 同理。而且,如果前面存在一个数 \(a_i\),有 \(pmx < a_i < pmn\),这个 \(pmx\)\(pmn\) 显然完全不合法。

整理一下信息:

  • 如果当前 \(mx \geq mn\),对于后面的序列,就是 \(> mx\) 的求最长上升,\(< mn\) 的求最长下降。
  • 如果 \(mx < mn\),一个 \(a_i < mx\) 归到了 \(mn\) 或者一个 \(a_i > mn\) 归到了 \(mx\),变成第一种情况。
  • 考虑弱化题目。
  • 枚举分界点,条件是 \(pmx < pmn < x\)\(x < pmx < pmn\)
  • 如果枚举了分界点的 \(pmx, pmn\),则前面的最优策略其实是固定的。具体来说,我们从前往后,如果一个数 \(\leq pmx\),它必须被归到 \(mx\) 中,\(pmn\) 同理。
  • 如果前面存在一个数 \(a_i\),有 \(pmx < a_i < pmn\),这个 \(pmx\)\(pmn\) 显然完全不合法。

我觉得枚举分界点就是对的,相关性质一大车。

第五个性质似乎能进一步深化:结合 \((6)\),我们发现不需要 \(pmn\),我们只需要 \(pmx\) 即可。也就是说,如果一个数 \(\leq pmx\),他就是 \(mx\),否则是 \(mn\)。所以考虑枚举 \(x\)\(pmx\),对于后面的最长上升子序列,可以预处理出来,前面也可以预处理,于是答案是:

  • 对于 \(pmx < a_x\),有 \(fmx_{pos_{pmx}} + fmn_{pos_{pmn}} + gmx_{a_x} + gmn_{pmx}\)
  • 对于 \(a_x < pmx\),有 \(fmx_{pos_{pmx}} + fmn_{pos_{pmn}} + gmx_{pmx} + gmn_{x}\)

这个时间复杂度为 \(\mathcal{O}(n^2)\)

这些式子似乎和 \(a_x\) 没啥关系?但其实关系还挺大。能不能优化掉?似乎不太行。那我们考虑快速维护答案。

这个无关的最长上升子序列好烦啊!!!\fn\fn\fn 为什么不好用数据结构维护?因为我们不能快速知道 \(a_i > pmx\)\(i > x\)\(t_i\) 最大值,其中 \(t_i\) 表示以 \(i\) 为开头的最长下降子序列,而且也不太好和之前的结合。前面要求的分别是 \(r_{pmx}\)\(l_{pmx}\),其中 \(r_i\) 表示以 \(a_x = i\) 结尾最多选多少,\(l_i\) 表示以 \(a_x > i\) 结尾最多能选多少。\(r_i\) 的修改是单点修改,\(l_i\) 的修改是区间 \(\max\)

理论上来说,\(l_i\) 改成 \(a_x = nxt(i)\) 结尾最多能选多少可以变成单点修改。 现在最傻逼的就是:

  • 我们不能快速知道 \(a_i > pmx\)\(i > x\)\(t_i\) 最大值,其中 \(t_i\) 表示以 \(i\) 为开头的最长下降子序列,而且也不太好和之前的结合。

CF1175F The Number of Subpermutations

似乎直接异或就行了。随机赋权+异或。


确实直接异或就行了,但是后面还有一些内容。

我们考虑如何快速找。如果暴力的话,对于每一个 \([l, r]\),我们都要验证 \(l, r\) 是否合法。

考虑优化,如果我们考虑对于每个右端点 \(r\),去计算所有的 \(l\) 左端点。对于这种情况,每个 \(r\) 为右端点的长度可能有 \(\mathcal{O}(n)\) 种。

我们考虑发掘合法区间 \([l, r]\) 的性质。如果 \([l, r]\) 里面全部是 \(1,\cdots,r - l + 1\),那么肯定只有一个 \(1\),而且 \(r - l + 1\) 一定是 \([l, r]\) 的最大值。

因此,考虑 \(1\) 和最大值。我们对于每一个 \(1\),向左 / 右边扫,扫到 \(1\) 就停止。然后假设当前扫到 \(r\),如果 \(1\) 之前有一个 \(l\),则 \(l\)\(r\) 的最大值就是这个区间应该判断的长度。然后 \(l\)\(r\) 的最大值要么在 \(1\) 左边,要么在 \(1\) 右边。因此,左右扫的时候,以最大值为长度判断可不可行即可。

CF1418G Three Occurrences

恰好为 \(3\) 没见过啊!回忆一下,我们做过 \(\mathbf{mod} \ 2\)\(0\) 的题,但是没见过恰好为 \(2\) 的题。先考虑 \(3\) 的倍数怎么做。

我们可以对于每个 \(cnt_{i}\),存 \(i\) 之前每个数出现次数 \(\mathbf{mod} \ 3\) 的集合,然后对于一个区间,\(cnt_{l - 1}\)\(cnt_r\) 集合构成一致时可以做。

但是现在是恰好为 \(3\),怎么做?我们考虑再判断每个数出现次数是否 \(\leq 3\)。这个直接 vector 加上 multiset 来轻松拿下。

2025.7.28

P8819 [CSP-S 2022] 星战

题目等价于对于每个连通块,点数等于边数。

其实等价于每个点出度为 \(1\)

然后发现入度其实很好维护。然而出度呢?

我们直接哈希即可。对每个点随机赋权,然后算和即可。

HDU6647 Bracket Sequences on Tree

考虑弱化题目,固定一个根。

显然是归纳的形式。

考虑研究括号序的本质,容易发现括号序实质上是将原树中的子树顺序打乱。因此,只有同构的两棵树括号序一模一样,其他情况括号序一定完全不重。

考虑 \(dp\)。则对于一个以 \(x\) 为根的子树,枚举所有子树的顺序。对于所有同构子树,这些括号序一定重复,因此这些顺子树的顺序要除掉。然后,对于每个 \(f\),将他们乘起来即可。判断子树同构可以使用哈希。

考虑换根,则我们直接暴力使用换根维护 \(f_i\) 即可。要注意一个细节:对于换根后与其他根的树同构的情况,不能算方案数。

CF1794E Labeling the Tree with Distances

考虑一个点到其他点的距离有没有什么神秘性质。显然标记为 \(0\) 的是起始点。因此只能有一个 \(0\)。考虑换根状物东西。

\(x\) 为根考虑维护每个深度的个数的数组 \(S\) 的哈希值,对于 \(a\) 求出来 \(n\) 种可能的哈希值 \(a_i\),存到 map 里。对于其他为根可以考虑哈希换根,类似于 \(\mathbf{DP}\) 维护即可。

51Nod1863 Travel

考虑从大往小贪心的去做,边权转化成 \(0\)\(1\)。可以使用 \(\mathbf{01BFS}\),复杂度为 \(\mathcal{O}(nm)\)

考虑对于所有的数一起 \(\mathbf{Dijkstra}\),然后我们要对于每个点去松弛。

不用 ds 不可做,也没有贪心做法,直接哈希也不行。于是维护主席树存每种数的出现次数,每个区间存哈希值,主席树上二分即可。

CF1746F Kazaee

常规不了啊,这个 \(k\) 怎么不是给定的。得使用人类智慧。

\(k\) 不是给定的,可以对每个 \(k\) 都做。但是做不了。考虑根号分治。

对于 \(k > \sqrt{n}\) 怎么做。能做。但是 G 了。


对于每个值赋权,然后求前缀和。

正常套路是 \(\mathbf{mod} \ k\),然后比较前面后面集合是否一样。但是这里不行。

正常 ds 完全没法做,根号分支又过不了。

由于所有数都是 \(k\) 的倍数,所以考虑不对前面的哈希值 \(\mathbf{mod} \ k\),然后直接减。

如果这个值能被 \(k\) 整除,就是合法的。

CF1771F

糖丸了,和精品题单一模一样。

P2757 [国家集训队] 等差子序列

容易发现只有长度为 \(3\) 的等差数列有用。

枚举中间的 \(p_i\),则 \(pos_{2p_i - x} < i\) 对于所有 \(x\)\(p_i\) 或者 \(2p_i - x > n\)

由于值域是两两匹配且和一定的,所以对于前面维护一颗线段树,考虑区间维护值域上正反的哈希值,判断相等即可。

P5537 【XR-3】系统设计

每条路径都对应了若干个序列。考虑对这些序列哈希。先不考虑 \(2\) 操作。

则,我们可以对 \(x\) 为根,存 \(x\) 到子树节点的 \(\mathbf{hash}\) 序列值,然后二分 \([l,r]\),每次取出一个前缀,判断子树中的 \(\mathbf{hash}\) 值中是否有这个哈希值。

\(x\) 上存不好,太多重复的终点重新算了。其实我们可以给 \([l, mid]\) 的哈希值前面拼上一个根到 \(x\) 的路径哈希值,然后就可以直接在根上做了。

加上 \(2\) 操作,我们可以线段树维护哈希值,然后二分改成线段树上二分。

使用 gp_hash_table,复杂度 \(\mathcal{O}(n \log n)\)

CF985F Isomorphic Strings

考虑观察匹配的判断方法。我们发现,我们不能直接哈希,因为字符这个值是不重要的,重要的是那些字符是相等的。但是如果一起哈希,由于我们不能把字符哈希进去,所以我们可以对于每个字符 \(c\),单独求一遍哪些位置字符为 \(c\),求出 \(01\) 串后哈希。最后把 \(26\) 个哈希值排序判断相等即可。

[AGC050A] AtCoder Jumper

这道题,好抽象啊。。。

考虑 \(x \to 2x\)\(x \to 2x + 1\),再对 \(n\) 取模即可。

posted @ 2025-07-23 19:02  DE_aemmprty  阅读(33)  评论(1)    收藏  举报