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\)。
逆向考虑。
如何求 \(g(j)\)?
\(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,则有:
时间复杂度 \(\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]
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]
「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\) 取模即可。

浙公网安备 33010602011771号