2026-week42 记录
SEATST 2026 Day 1 C. XOR Teleport
记 \(w(u, v) = \begin{cases}a_{u} \oplus a_{v}& \operatorname{anc}(u, v)\lor \operatorname{anc}(v, u)\\ +\infty & \operatorname{otherwise}\end{cases}\),询问相当于是问最小的 \(X\) 使得只保留 \(w(*, *) \le X\) 的边 \(u, v\) 连通,于是 \(x = \min\limits_{p_{1\sim l}, p_{1} = u, p_{l} = v}(\max\limits_{{i = 1}}^{l - 1} w(p_{i}, p_{i + 1}))\)。
先抛弃这个图 \(w(u, v)\) 的性质,考虑如果是个一般图该如何求解询问。会发现 \(u, v\) 间路径选择一定会是最小生成树上的简单路径。
如果知道了最小生成树,建出 Kruskal 重构树,查询树上 LCA 就解决了问题。
而对于这个题的最小生成树,因为边数是 \(\mathrm{O}(n^2)\) 的,不能使用 Kruskal,转而考虑 Boruvka。使用 Boruvka 后,每一轮每个点 \(u\) 要得到的信息为 \(\min\limits_{id_{v}\not= id_{u}} w(u, v)\)。
而权值是异或的形式,故子树内权值可以以通过 trie 树合并得到,祖先权值可以通过 dfs 时的加入撤销得到。
时间复杂度 \(\mathrm{O}(n\log V\log n + q\log n)\)。
UCup 3rd-18 B. NonZero PrefSuf Sums
感受一下大部分情况应该都是合法的,于是对不合法的情况计数。
若 \(\sum\limits_{i = 1}^n a_{i} = 0\),则无论如何分配始终不合法,可以在 \(\mathrm{O}(n^2m^2)\) 或用前缀和优化在 \(\mathrm{O}(n^2m)\) 的复杂度内计数。
接下来不妨假设 \(s = \sum\limits_{i = 1}^n a_{i} > 0\)(\(s < 0\) 是对称的),前缀和为 \(0\) 和为 \(s\) 都不合法。
此时有一个构造想法是把 \(a\) 中的所有正数放在前面加完,再把 \(a\) 中的负数放在后面逐步降到 \(s\)。这样的好处是只有可能正数加到 \(s\) 时会不合法,于是分析什么情况下正数无论如何分配都会加到 \(s\)。
一个直觉是除非所有正数相同否则一定可以不加出 \(s\)。考虑把正数从小到大加,如果没有加出 \(s\) 则无所谓,如果加出 \(s\) 了,此时没选的正数和选的正数一定存在不同的值,交换这两个值合法。(这里有个漏洞,若正数和恰好为 \(s\),即没有负数只有正数和 \(0\)。当只有一个正数时不合法,不过这个情况依然满足所有正数相同。)
接下来分析所有正数相同时(记为 \(x\))不合法的条件。
首先有 \(s = kx(k > 1)\)。其次若负数中存在数 \(\bmod x\not = 0\),因为 \(s, 0\) 均为 \(x\) 的倍数,先选了这个负数再把剩下的正数选完最后选剩下的负数合法,故所有负数也得是 \(x\) 的倍数。
于是只需考虑数均为 \(k_{i}x(k_{i}\le 1)\) 的情况。此时无论怎么选择和都为 \(x\) 的倍数。若存在一个时刻和 \(< 0\),则在之后必定要经过 \(0\) 不合法;同样的若存在一个时刻和 \(> s\) 则在之前必定要经过 \(s\) 不合法。故除刚开始和结尾的时候和都需在 \((0, s)\) 中,故合法条件为 \(\max\limits_{i = 1}^n (-k_{i})\le \sum\limits_{i = 1}^n k_{i} - 2\),不合法条件即为 \(\max\limits_{i = 1}^n (-k_{i}) + 1\ge \sum\limits_{i = 1}^n k_{i}\)。
枚举 \(x\) 计数,记 \(f_{i, s, j}\) 表示选择了 \(1\sim i\) 的 \(k_{i}\),\(\sum k_{i} = s, \max (-k_{i}) + 1 = j\) 的方案数。转移只需要枚举 \(k_{i + 1}\) 的选择。因为 \(|k_{i}x|\le m\),所以有 \(-\lfloor m / x\rfloor\le k_{i}\le 1\),\(j\) 和枚举量都是 \(\mathrm{O}(m / x)\) 的。因为 \(k_{i}\le 1\),正数的和至多为 \(n\),故 \(-n\le k\le n\),\(k\) 是 \(\mathrm{O}(n)\) 的。这部分复杂度为 \(\mathrm{O}\left( \sum\limits_{i = 1}^n \frac{n^2m^2}{i^2}\right) = \mathrm{O}(n^2m^2)\)。
进一步可以枚举最终的和 \(s(s\le \lfloor m / x \rfloor + 1)\),对 \(\max\) 的限制利用容斥转为 \(k_{i}\) 需在一段区间内,使用前缀和优化做到 \(\mathrm{O}\left( \sum\limits_{i = 1}^m \frac{n^2m}{i} \right) = \mathrm{O}(n^2 m \ln m)\)。
UCup 3rd-18 I. Donkey, Keep Watch
记 \(k = \log \max a_{i} = 14\)。
从低位到高位考虑 \(\operatorname{XOR}(s) + \operatorname{AND}(s) = \operatorname{OR}(s)\) 的限制,如果这一位有 \(1\),那么 \(\operatorname{OR}\) 就为 \(1\),\(\operatorname{XOR}, \operatorname{AND}\) 就应该恰有一个值为 \(1\)。分讨一下条件如下:
- 若 \(|s|\bmod 2 = 0\),则 \(s\) 中有奇数个 \(1\) 或 \(s\) 中均为 \(1\)。
- 若 \(|s|\bmod 2 = 1\),则 \(s\) 中有奇数个 \(1\) 且不全为 \(1\)。
于是不可避免的需要对每一位枚举 \(op_{w}\in \{0, 1, 2\}\) 分别表示这一位没有 \(1\) / 这一位全为 \(1\) / 这一维有奇数个 \(1\)。
首先来考虑 \(|s|\bmod 2 = 0\) 的情况,假设已经知道了 \(op_{0\sim k - 1}\),此时能够选的值 \(x\) 需要满足:若 \(op_{w} = 0\),则 \(x_{w} = 0\);若 \(op_{w} = 1\),则 \(x_{w} = 1\)。因为 \(op_{w} = 2\) 是个异或的形式,若 \(x\) 满足则保留 \(x\) 在 \(op_{w} = 2\) 的 \(w\) 中的值放入线性基,若线性基能表示出 \(op_{w} = 2\) 的位全为 \(1\) 的情况,方案数为消为 \(0\) 的值的个数的 \(2\) 的次幂,需要特殊处理空集。同时因为还需要保证 \(|s|\bmod 2 = 0\),考虑在值的后面再添一个 \(1\) 代表选中的元素的奇偶。
因为每一种 \(op_{0\sim k - 1}\) 都需要把 \(2^{\sum [op_{i} = 2]}\) 个数放入线性基,复杂度为 \(\mathrm{O}(4^k k)\)。复杂度高的原因是 \(op_{0\sim k - 1}\) 对应的线性基维护方式太过暴力。尝试优化这个线性基的过程。
\(op_w\) 可以看作若为 \(0\) 是强制 \(0\),为 \(1\) 强制 \(1\),为 \(2\) 随意。类比高位前缀和的过程,发现对于 \(op_{0\sim k - 1}\),若存在 \(op_{w} = 2\),则考虑把其余 \(op\) 不变,\(op_{w}\) 分别取 \(0, 1\) 的两种 \(op\) 序列的线性基并起来。
这里需要特殊考虑 \(w\) 这一位的值,首先 \(op_{w} = 0\) 的线性基 \(w\) 这一位肯定都为 \(0\),而 \(op_{w} = 1\) 的线性基的元素要根据得到这个元素异或的元素个数的奇偶决定,而这个值也就是加的辅助位的值。
于是线性基就在 \(\mathrm{O}(3^k k^2)\) 的复杂度内处理出了。
最后来考虑 \(|s|\bmod 2 = 1\) 的情况,合法条件在 \(|s|\bmod 2 = 0\) 的条件上多了个 \(\operatorname{AND}(s) = 0\),也就是没有 \(op_{w} = 1\) 的 \(w\);于是考虑对 \(op_{w} = 1\) 做容斥,每种 \(op\) 带上 \((-1)^{\sum [op_{i} = 1]}\) 的系数,一个方案能被统计当且仅当 \(\sum [op_{i} = 1] = 0\),符合条件。
也可以对于 \(op\) 序列直接维护合法的 \(x\) 的线性基(不去掉 \(op_{w} = 1\) 的位),这样线性基合并的部分会更加直观,就是直接把两部分拿来求交,只是算答案时候要求线性基得到的数会有同。
感觉这个做法更简单。
UCup 3rd-18 M. Enchanted Lawns Quest
尝试刻画直径,树形 dp 等涉及 \(\max\) 的求法会因为 \(\max\) 涉及每条边的不定增量无法比较故不可行,一个想法是直接钦定直径中点。
如果知道了直径中点且知道了直径长度 \(x\),合法条件为直径中点两侧的最大深度都 \(\le \frac{x}{2}\),于是二分直径长度 \(\frac{x}{2}\),判定条件为使得两侧最大深度 \(\le x / 2\) 最多能加的值是否 \(\ge w\)。
以直径中点为根,若一条非叶边被增加了值,则一定可以把这个增量放在子树内所有叶边而不是该边,此时所有叶子到根距离都没有变,增加的值变多。所以加的值一定只会叶边,距离关系当然也只需要考虑到叶子的距离。
当然直径端点可能在边上,所以枚举 \((u, v, w)\) 和 \(0\le y\le w\) 表示直径中点在 \((u, v, w)\) 上与 \(u\) 距离为 \(y\) 的位置,接下来考虑判定这个点是否合法:
- 为了保证每条边的增量都是非负整数(题目要求),若 \(x\) 为偶数,则 \(\frac{x}{2}\) 为整数,\(y\) 也为正数;若 \(x\) 为奇数,则 \(\frac{x}{2}\) 为 \(.5\) 小数,\(y\) 也为 \(.5\) 小数。
- 若存在叶子还没有增加距离与 \(y\) 的距离就 \(> \frac{x}{2}\) 则 \(x\) 不合法,记 \(mx_{u}, mx_{v}\) 分别代表去掉 \((u, v, w)\) 这条边 \(u, v\) 分别为根的最大深度,有 \(mx_{u} + y\le \frac{x}{2}, mx_{v} + w - y\le \frac{x}{2}\)。
- 增加量 \(\ge w\),同样的记 \(cnt_{u}, cnt_{v}, sum_{u}, sum_{v}\) 分别代表以其为根的叶子数量和叶子到根距离和,有 \(\frac{x}{2}(cnt_{u} + cnt_{v}) - sum_{u} - sum_{v} - y\cdot cnt_{u} - (w - y)\cdot cnt_{v}\ge w\)。
注意到前两条限制和 \(0\le y\le w\) 的限制都是把 \(y\) 限制在一个区域 \([y_{\min}, y_{\max}]\) 内,而最后一条限制左侧的式子是关于 \(y\) 的一次函数 \(f(y)\),有 \(f(y)_{\max} = \max(f(y_{\min}), f(y_{\max}))\)。所以对于边 \((u, v, w)\) 不需要枚举 \(y\) 而只需要先求出 \(y\) 的范围再代入端点处的 \(f(y)\) 看是否有 \(f(y)_{\max}\ge w\)。
同时 \(mx_{u}, cnt_{u}, sum_{u}\) 都是可以通过换根 dp 在 \(\mathrm{O}(n)\) 的复杂度内求出的。
总时间复杂度为 \(\mathrm{O}(n\log \max \operatorname{ans})\),把 \(y_{\min}, y_{\max}\) 的表达式代入 \(f(y)\) 去解一次函数可能能做到 \(\mathrm{O}(n)\)。
Atcoder NDPC J. Number and Total
写出生成函数 \(F(x, y) = \prod\limits_{i = 1}^n \frac{1}{1 - xy^{a_{i}}}\),答案即为 \([x^S y^T] F(x, y)\)。
考虑 Bostan-Mori,这里考虑对分母的单项式配成平方的形式,那么只需要类似平方差,上下同乘 \(\prod\limits_{i = 1}^n (1 + xy^{a_{i}})\),分母就变为了 \(\prod\limits_{i = 1}^n (1 - x^2y^{2a_{i}})\),而这就是原始的分母把 \(x, y\) 替换成了 \(x^2, y^{2}\),剩下的就是一般的 Bostan-Mori 做法了,维护分子 \(P(x, y)\),每次上下同乘后只保留 \(x\) 指数与 \(S\) 奇偶相同,\(y\) 指数与 \(T\) 奇偶相同的部分,这样就实现了 \(S, T\) 减半。
复杂度 \(\mathrm{O}(n^3\max a\log \max(S, T))\)。
另一个组合意义:考虑对每个 \(a_{i}\) 的数量做二进制拆分,从低位到高位依次决定,数量是 \(2^c\) 时物品数和总重量都是 \(2^c\) 的倍数,故位 \(w\) 推到 \(w + 1\) 位时 \(w\) 位必须和 \(S, T\) 匹配上。与 Bostan-Mori 的过程完全相同。
Raney Lemma
https://www.cnblogs.com/rizynvu/p/23316801
Lagrange 反演入门
https://www.cnblogs.com/rizynvu/p/23320187
基于欧拉序的 O(n)-O(1) 静态在线 k 级祖先
https://www.cnblogs.com/rizynvu/p/23331570
CF2141 H. Merging Vertices in a Graph
合并两点 \(u, v\) 相当于是把 \(u, v\) 的连边求了一个交。转为补图,合并相当于是连边求并,这样会直观一些。
合法则相当于对于当前合并出的点集 \(S_{1}, S_{2}, \cdots\),存在 \(S_{i}\) 满足 \(S_{i}\) 不与其他 \(S_{j}\) 有连边,等价于 \(S_{i}\) 中的点的所有边都在内部。于是 \(S_{i}\) 一定得是补图的若干个极大连通块的并。
最少次数也就是最小连通块大小 \(-1\)。最大次数则可以找到一对有边的 \((u, v)\),一直把其他的点和 \(u\) 合并,中间一定都不合法,最后合并 \((u, v)\),次数为 \(n - 1\)。
补图连通块是比较经典的问题,直接用 set 维护还没遍历到的点,每次遍历到 \(u\) 时先一次性把补图中与 \(u\) 有边(实际没边)且还没遍历到的点找到再递归,这里找点可以直接暴力遍历 set 中的元素并去判断。复杂度考虑暴力遍历要么这个点会被加入连通块要么和该点在原图有连边,所以只有 \(\mathrm{O}(n + m)\) 次,用 set 判断复杂度即为 \(\mathrm{O}((n + m)\log n)\)。

浙公网安备 33010602011771号