ARC 杂题乱做
[ARC222E] XOR Matching
*2400
给定长度为 \(n\) 的序列 \(a\),有 \(a_i \in [0, 2^m - 1)\),定义 \(f(x)\) 表示最多能将 \(a\) 中的多少对元素两两配对之后每对的两个数异或和为 \(x\),需要求:
\(n \leq 2 \cdot 10^5, \ m \leq 20.\)
设 \(cnt_i\) 表示 \(a\) 中 \(i\) 的数量,那么显然:
这是显然的,因为 \(i\) 只能和 \(i \oplus x\) 配对,所以显然只能取两者数量较小的那个,注意 \(x = 0\) 的时候需要特判,因为此时是 \(\lfloor \frac{cnt_i}{2} \rfloor\)。
然后推式子(其中 \(c_i\) 是 \(cnt\) 排序后的结果,然后 \(p_i\) 是 \(c_i\) 原来是 \(cnt_{p_i}\) 排序过来的):
于是本质上只需要对每个 \(i\),算出 \(\sum_{j > i} 10^{p_i \oplus p_j}\) 即可,显然你发现它等价于强制在线修改算异或卷积,即(设 \(h_i\) 表示是否有 \(p_j\) 等于 \(i\)):
即考虑 \(\{10^i\}\) 和 \(\{h\}\) 的异或卷积的第 \(p_i\) 位,就是 \(i\) 的答案,我们要支持的是单点修改 \(h\),于是朴素 poly 做法肯定没有,于是直接根号分治,有值的 \(p\) 只有 \(n\) 个,设块长为 \(B\),每经过 \(B\) 位就先 FWT 暴力卷一次,然后每次查询 \(i\) 答案就是 \(ans_{p_i}\) 再暴力遍历它后面最多 \(B\) 个。
复杂度是 \(O(\frac{n}{B} 2^m m + n B) \ge O(n \cdot 2^{\frac{m}{2}} \sqrt m)\),可以通过。
轻微卡常。
[ARC222F] Triple Transformation
*3500
考虑对三个非负整数组成的三元组 \((x, y, z)\) 进行一种操作。每次操作按照以下规则替换 \((x, y, z)\):
- 如果 \(y + z < x\):替换为 \((x - y - z, 2y, 2z)\)。
- 如果 \(x + z < y\):替换为 \((2x, y - x - z, 2z)\)。
- 如果 \(x + y < z\):替换为 \((2x, 2y, z - x - y)\)。
- 如果以上情况都不满足:替换为 \((y + z - x, x + z - y, x + y - z)\)。
注意,每组非负整数的三元组都正好属于上述四种情况中的一种。
现在给定非负整数 \(A_1, A_2, A_3, B_1, B_2, B_3\)。你需要对三元组 \((A_1, A_2, A_3)\) 进行若干次(可以为零次)上述操作,使其变为 \((B_1, B_2, B_3)\)。求最少需要多少次操作。如果无论如何也无法变为 \((B_1, B_2, B_3)\),输出 \(-1\)。
\(1 \le T \le 300, 0 \le A_1, A_2, A_3, B_1, B_2, B_3 \le 10^8.\)
不是题。
因为你发现每次操作是唯一变换的,判定一个点能不能到另外一个点容易先想到能不能倍增第一个点找一下性质,即快速求出一个点变换 \(k\) 次后的点。
首先你发现操作特别抽象,考虑找一下性质;有一个比较显然的性质就是,每次操作的和是不变的,都是 \(x + y + z\),于是 check 时如果和不同就可以直接 \(-1\);先令 \(S = x + y + z\)。
更深层的,感觉每次变化的值没啥特别,具体的,例如第一个元素,只能变化成 \(x - y - z, 2x, y + z - x\),可以先发现 \(x - y - z\) 和 \(y + z - x\) 是相反数,同时 \((x - y - z) + S = 2x, (y + z - x) - S = -2x\)。
于是考虑模 \(S\) 意义下:
-
前面三种操作在模 \(S\) 意义下会变成 \((2x, 2y, 2z)\)。
-
而最后一种操作会直接变成 \((-2x, -2y, -2z)\)。
于是 \((x, y, z)\) 变换 \(k\) 次后,设 \(a \equiv 2^k x, b \equiv 2^k y, c \equiv 2^k z\),显然根据进行最后一次操作的奇偶性区分正负,有:
那么具体是哪个呢?(赛时做到这里可以直接猜最后只要是这两个之一就一定有解就可以迅速做完)
再分析下性质,对于上面的操作:
-
如果变成 \((2x, 2y, 2z)\),显然三个数模 \(S\) 后和还是 \(S\)(因为只会将一个数减少另外两个数加的,而另外两个数加了后还是 \(<S\))。
-
而如果变成 \((-2x, -2y, -2z)\),说明 \(x, y, z < \frac{S}{2}\),于是误判到 \((2x, 2y, 2z)\) 后是不取模的,三个数的和是 \(2S\)。
所以在每一步 \(F_{k - 1}(x, y, z) \to F_k(x, y, z)\) 时,我先全部乘以 \(2\),如果模了之后和是 \(S\),说明这步走的是 \((2x, 2y, 2z)\),否则走的是 \((-2x, -2y, -2z)\) 的这步。
这样还是不好快速算走 \(k\) 步后的结果,考虑因为两次 \(-2\) 操作会互相抵消,只需要考虑 \(-2\) 出现了奇数次且最后一次 \(-2\) 的位置,因为这是最后一次 \(-2\),所以后面一直 \(+2\) 不会出现三个数都 \(< \frac{S}{2}\) 的情况;而如果在最后那里出现了误判,直接 \(+2\) 的话,三个数和会先是 \(2S\),我们论证它后面会一直是 \(2S\):
-
具体的,设最后一次 \(-2\) 前是 \((x, y, z)\),后面是 \((-2^k x, -2^k y, -2^k z)\) 它们不会出现三个数都 \(< \frac{S}{2}\) 的情况,所以误判后 \((2^k x, 2^k y, 2^k z)\) 不会出现三个数都 \(> \frac{S}{2}\) 的情况。
-
而因为和是 \(2S\),所以至少要两个 \(> \frac{S}{2}\) 的数,根据上面的限制;所以后面 \((2^k x, 2^k y, 2^k z)\) 是恰好有两个 \(> \frac{S}{2}\) 的数,于是 \(2S \cdot 2 - 2S = 2S\),和还是 \(2S\) 不变,一直往后推可以归纳证明得到。
于是算 \(F_k(x, y, z)\),只需要考虑 \((2^k x, 2^k y, 2^k z)\) 的和是 \(S\) 还是 \(2S\) 就行了;但是你会发现一个致命问题,即如果过程中出现了 \(0\),前面的结论就会出现错误,你无法判定是 \(0\) 还是 \(S\) 等……
考虑尽量避免这种情况 \(2^k x \equiv 0 \pmod S\),而 \((x, S)\) 可能 \(>1\),这样 \(x\) 的解特别多,不太好做,考虑:
-
如果 \(S\) 是偶数,那么经过一次操作后一定会全部变成偶数;
-
而如果全部都是偶数,显然可以全部除以二处理是不影响的。
于是暴力做最多 \(O(\log S)\) 次操作 \(S\) 就是奇数了,中间如果已经变化成功了就退出即可;此时 \(2^k x \equiv 0 \pmod S\) 因为 \((x, S) = 1\),所以只有 \(S \mid x\),而根据 \(x\) 的范围,\(x\) 只能是 \(0\),于是在变化过程中不会出现变成 \(0\) 的情况。
所以只有初始是 \(0\) 的情况:
-
如果只有一个 \(0\),且 \(S\) 是奇数,所以其它两个一定有一个大的,所以每次操作是全部 \(+2\) 形的,前面的结论依旧适用。
-
如果有两个 \(0\),显然操作后和本身相同,于是特判一下即可。
-
三个 \(0\),一样特判。
特判后,只需要解决判定 \(F^k(x, y, z)\) 是否能到 \((X, Y, Z)\) 的问题了,而 \(F^k(x, y, z)\) 是 \(2^k (x, y, z)\) 相关,于是本质是在解:
这两个方程组,只要其中一个有解,那么就有解。
这不就是 BSGS 吗,先设定一个 \(B\),设 \(k = uB + v\),于是方程转化为:
于是预处理所有的 \((2^{-v}X, 2^{-v}Y, 2^{-v}Z)\),枚举 \(u\) 的时候判定是否存在即可;显然 \(2^k\) 最多有 \(O(S)\) 种取值,令 \(B = \sqrt S\) 即可。
时间复杂度为 \(O(T \sqrt S \log S)\)。
[ARC230D] Min Max Matrix
*2400
给定正整数 \(H,W,M\),求满足以下条件的 \(H\times W\) 矩阵 \(A\) 的个数(每个元素为 \(1\) 到 \(M\) 的整数),答案对 \(998244353\) 取模:
\(H,W \le 200\),\(M \le 10^8\)。
首先不难发现左边恒大于等于右边。
考虑对于 \(i, j\),有 \(R_i \ge A_{i, j} \ge C_j\)。
于是只要右边小于等于左边即可;枚举这个式子的值,设为 \(k\),那么显然只要存在一行都 \(\le k\),存在一列都 \(\ge k\) 就合法。
直接二维二项式反演一下,容斥钦定有 \(i\) 行 \(\le k\) 有 \(j\) 列 \(\ge k\),那么显然方案数 \(k^{i(m - j)} (w - k + 1)^{j (n - i)} w^{(n - i)(m - j)}\),于是答案是:
原题 cf 因为 \(m\) 特别大,所以可能容易想到;但是 arc 那题 \(n, m\) 同阶的,看到这个式子第一想法不是把 \(k\) 相关挪到后面考虑能不能快速算吗???然后卡了 \(O(n^4)\) 挺久,才发现这后面可以二项式定理!
具体的,注意到后面那个式子是:
令 \(A = k^i w^{n - i}, B = (w - k + 1)^{n - i}\),那么上面式子是:
所以枚举 \(k\) 和 \(i\) 复杂度就是 \(O(nv \log n)\) 了。
然后再发现答案关于 \(w\) 是一个不超过 \(nm\) 的多项式,所以算出前面 \(nm\) 项的点值然后拉插即可,时间复杂度为 \(O(n^2 m \log n)\)。
[ARC230A] Meeting on Tree
*900
这题 *900???骗鬼呢???
给定一棵 \(N\) 个点的树,每个点上有一只松鼠。对于每个非空点集 \(S\),可以选择树上一个点 \(v\) 作为集合点,代价为 \(\sum_{u \in S} \operatorname{dist}(u,v)\),其中 \(\operatorname{dist}(u,v)\) 表示树上 \(u\) 到 \(v\) 的距离。定义 \(f(S)\) 为选择最优 \(v\) 时的最小代价。求所有非空点集 \(S\) 的 \(f(S)\) 之和,对 \(998244353\) 取模。
考虑一条边的贡献,枚举左右两边分别选了多少点,显然有:
显然枚举 \(u\) 是必要的,考虑怎么快速算后面的式子,即:
你发现难点在于 \(\sum_{i \le x'} \binom{x'}{i} \sum_{j \le i} \binom{y'}{j}\) 这种类型式子上,先反转下标转化成 \(i + j\) 的限制,考虑枚举 \(k = i + j\),然后范德蒙雷卷积,那么:
而 \(x' + y' = n - 1\) 是定值,预处理它的后缀和即可,时间复杂度为 \(O(n)\)。
[ARC228C] Partially Sort
*3000
给定一个长度为 \(N\) 的排列 \(P\)。对于 \((1,2,\dots,N)\) 的任意子序列 \(x\)(共 \(2^N\) 种,包括空序列),定义 \(f(x)\) 为:将 \(P\) 中下标属于 \(x\) 的那些位置上的数取出并升序排序,再依次放回这些位置后得到的序列。求所有 \(f(x)\) 的逆序对数之和,对 \(998244353\) 取模。
\(N \leq 2 \times 10^5\),\(P\) 是 \((1,2,\dots,N)\) 的一个排列。
显然拆贡献去做,考虑一对原来逆序对的贡献 \((i, j)\),即 \(i < j, p_i > p_j\),如果操作不涉及到它们,那么依旧是逆序对,方案数是 \(2^{n - 2}\);否则如果两个都涉及到,那么它们肯定不会造成贡献(因为排序了),否则只会涉及到一个。
设没有被选的那个是 \(x\),考虑它的贡献,你发现对于排序后的那些数,要么都在左边构成逆序对,要么都在右边构成逆序对,这是显然的;具体的,考虑选的 \(i < x\) 的数量 \(a\) 和 \(p_i < p_x\) 的数量 \(b\),如果 \(b < a\),说明贡献在左边构成逆序对,数量是 \(a - b\);否则在右边构成逆序对,贡献是 \(b - a\)。
所以对于 \(x\),只要求出选的 \(i < x\) 的数量 \(a\) 和 \(p_i < p_x\) 的数量 \(b\),那么贡献是 \(|a - b|\);先算出全局 \(p_i < p_x\) 的数量 \(y = p_x - 1\),和 \(x\) 前面 \(<p_x\) 的数量 \(z\),枚举一下 \(c\) 表示前面选的 \(<p_x\) 的个数:
于是问题变为快速算:
考虑换元 \(i = a - c, j = b - c\) 分别表示选的 \(< x\) 中 \(> p_x\) 的数量和 \(>x\) 中 \(<p_x\) 的数量,那么式子变为:
那么 \(c\) 就是独立的了,系数是 \(2^z\),令 \(n = x - 1 - z, m = y - z\),对于单个 \(x\) 转化为求:
然后考虑:
现在你发现难点在于 \(\sum_{i \le x'} \binom{x'}{i} \sum_{j \le i} \binom{y'}{j}\) 这种类型式子上,先反转下标转化成 \(i + j\) 的限制,考虑枚举 \(k = i + j\),然后范德蒙雷卷积,那么:
这个 trick 和 [ARC230A] Meeting on Tree 完全一致,不知道为什么这么近的时间出同一个何意味???而且一个 *900,一个 *3000!!!
于是:
你发现这是一个组合数后缀和的问题,可以写成前缀和的形式好看点:
上指标每次询问都不固定,于是直接暴力莫队去维护即可。
时间复杂度为 \(O(n \sqrt n)\)。
[ARC232E] Doubling
*3600
给定一个长度为 \(N+1\) 的非负整数序列 \(X\)(其中 \(X_{N+1}=0\))和一个整数 \(K\)。
你可以执行以下操作:选择一个 \(1 \le i \le N\) 且 \(X_i \ge 1\),令 \(X_i\) 减 \(1\),\(X_{i+1}\) 加 \(2\)。
对于每个 \(k = 1, 2, \dots, K\),求恰好执行 \(k\) 次操作后,能得到多少种不同的序列。答案对 \(998244353\) 取模。
\(N \le 20, K \le 250000.\)
区区题,这题 *3600???
考虑每个位置操作的次数 \(a_i\),因为跟操作顺序无关,我们总可以从前往后操作,这里令原来的 \(x_i\) 为 \(A_i\),操作后的是 \(A'_i = A_i - a_i + 2a_{i - 1}\),因为 \(A'_i \ge 0\),所以 \(a_i \le A_i + 2a_{i - 1}\)。
对于所有满足这个条件的 \(a\) 对应的序列显然互不相同(容易反证法证明),于是只需要数满足 \(a_1 \le A_1, a_i \le A_i + 2_{a - 1}\) 的序列 \(a\) 数量即可;然后答案要对于每个 \(k\) 算出 \(\sum a_i = k\) 的方案。
有一个显然的 \(dp\),考虑 \(dp_{i, j, k}\) 表示前 \(i\) 个数选的 \(\sum a = j\) 然后 \(a_i = k\) 的方案数,转移是 容易的,可以刷表转移 \(i + 1\),即枚举 \(a_{i + 1} \in [0, A_{i + 1} + 2k]\),直接做是 \(O(nk^3)\) 的,完全无法通过。
看起来状态数就不太好优化,考虑生成函数,你发现一维生成函数也是不太好转移的,刚好 \(dp\) 后面有两维,于是设:
初始 \(F_1(x, y) = \sum_{i \le A_1} x^i y^i\);刷表可以得到:
这个递推式子一点也不漂亮,想了挺久感觉不太能求封闭形式;然后你可以注意到一个关键性质,这个递推式中第一项始终是 \(x\) 即算 \(F_i(x, \cdot)\),然后再考虑一下最终答案是什么,求 \(\sum a = m\) 的方案数是 \([x^m]F_n(x, 1)\),于是只需要算 \(F_n(x, 1)\)。
使用上面的递推式子:
然后你还要算 \(F_{n - 1}(x, x^2)\),相当于要多算 \(F_{n - 2}(x, x^6)\),推广开来,对于每个 \((i, k)\) 你需要算 \(F_i(x, x^{2^k - 2})\),显然 \(k\) 是 \(n\) 级别的;然后考虑除法怎么做,你需要乘上一个 \(\frac{1}{1 - x^p}\) 这个形式,可以看作乘以 \((1 + x^p + x^{2p} + \cdots)\),于是可以看作一个 \(p\) 前缀和的形式,即 \(s_i \gets s_i + s_{i - p}\),可以 \(O(k)\) 算。
于是你要进行 \(n^2\) 次多项式的加减操作,时间复杂度是 \(O(n^2k)\) 的,可以轻松通过;精细实现可以做到 \(O(n \min(n, \log k) k)\),不过没有必要。
[ARC186D] Polish Mania
*2800
定义一种非空非负整数序列为 Polish 序列。递归定义如下:
- 若一个序列的第一个数为 \(V_1\),且紧接着它后面是由 \(V_1\) 个 Polish 序列 依次拼接而成的,那么这个序列就是 Polish 序列。
- 特别地,序列 \((0)\) 是 Polish 序列。
给定一个长度为 \(N\) 的非负整数序列 \(A\)。求所有长度为 \(N\)、且字典序小于等于 \(A\) 的 Polish 序列的个数,答案对 \(998244353\) 取模。
\(1 \le N \le 3 \times 10^5\),\(0 \le A_i < N.\)
你发现这个条件显然像个树啊,然后 \(a_i\) 表示儿子数,找一下充要条件啊,显然:
-
\(\sum a_i = n - 1\)。
-
对于任何后 \(i\) 个数的和满足 \(\sum_{j \le i} a_i < i\),这是因为在任何时刻,后面 \(i\) 个涉及到的儿子只能是后面 \(i - 1\) 个点,如果总儿子数量是 \(\ge i\) 的那么一定无解(注意要把 \(a\) 翻转过来考虑)。
容易发现这是充要的,满足这个条件一定可以构造出树来。
翻转后,显然 \(a_1 = 0\),后面可以看作走格路计数,初始在 \((0, 0)\)(横坐标表示 \(i\),纵坐标表示 \(\sum a\)),每次向右或向上走,不能碰到 \(y = x + 1\),最终走到 \((n - 1, n - 1)\) 的方案数,这显然是卡特兰。
然后考虑字典序的限制,显然枚举 \(LCP = n - i\),再枚举 \(a_i < h_i\),设后面 \(LCP\) 部分和为 \(s\);于是限制在 \(a\) 上是末尾经过的那些点是已经确定了(如果已经不合法了直接退出),那么答案是:
其中 \(F(x, y)\) 是 \((0, 0) \to (x, y)\) 不碰到 \(y = x + 1\) 的方案数,直接单线反射容斥,用 \((0, 0) \to (x, y)\) 的减去 \((0, 0) \to (x + 1, y - 1)\) 的路径即可,于是:
于是答案是:
本质上是 \(\sum_{0 \le i \le L} \binom{X - i}{Y} = \binom{X + 1}{Y + 1} - \binom{X - L}{Y + 1}\),于是可以 \(O(1)\) 算。
总时间复杂度为 \(O(n)\)。

浙公网安备 33010602011771号