ARC227
AtCoder Regular Contest 227
闲话
终于又找到一场正常的,\([223,226]\) 这四个 shit round 全部十分变态,无论是我个人感受还是 uq,LA 的整体评价都显示这四个贵物属于刷新 ARC 历史质量新低的存在。225 除外它只是长得太奇怪了,这个会考虑补。
这场整体打的比较顺,没有出现任何不应该的罚时,这个可能是因为逐渐适应了自己写对拍的节奏,并且经过这段时间的训练大概能在想题的时候并行出来最极端的数据大概长什么样这种问题。另外就是这场所有题都比较偏 Ad-hoc,三个构造一个 Yes/No 两个数数,代码难度不大算法细节不多(但与之对应的就是样例很弱,一是没法逃避写拍二是没法验证结论而更多要依赖证明能力),所以只要写了拍基本不会出现挂掉的情况。不过反过来说注意到因为样例弱前面老哥罚时都不少,某种程度上是利好?
进去发现 ABC 三个构造,其中 A 看上去要么是操作有不变量,要么是我们注意到一些简单贪心策略,B 是要你构造某种符合二维偏序的东西,那么肯定是固定一维条件然后对另一维调整法/数据结构优化贪心之类的,C看起来不像是正常字符串,看上去字符集更多起到一个“值域很小”的作用,估计是纯正 Ad-hoc 问题。
这三个题没有给到太大阻力,A 注意到可以仅关注字符串中 1 的下标,然后拆距离是曼哈顿状物的离散距离所以直接考虑中位数即可。B 注意到从下标入手并不好做,大概就是先考虑如何判无解,注意到值域必定连续,并且对于一个 \(A\) 中存在的取值它对严格小于它的元素的数量有要求,所以肯定是 Abel 变换一下然后在值域上一层一层构造。C 难以直接分析每一步操作,可能的思路是从一次操作对整体的影响来看,然后你注意到 \(L \leq n^2\) 并且直接构造 \(S^{n}\) 状物对任意情况都是合法的,这给了一个相当重要的切入角度是 \(S\) 的整周期划分,进一步分析精确的答案 \(k\) 就不难了。
然后 D 题你注意到任意一步生成新串都是难以判定的,所以明显有一些 key observation/conclusion,先从操作入手,分析出必要条件是三个输入串里面,大小至少为 \(2\) 的两个集合必有交集。分析充分性发现就是归纳地处理刚刚必要性的极小结构 \(|S| = 2\) 的情形中,两个位置 \((i,j)\) 在每一个新生成的串上实际对应的位置。那么只需要确保对任意两个位置 \(i,j\),新串 \(T\) 均满足:存在某个初始串 \(S_k\) 使得 \(S_{k,i} = T_i, S_{k,j} = T_j\) 即可。详细的充分性考虑对 \(L = 1, 2, 3\) 分别给出构造然后归纳法即可证明。
E 题是尤为困难的,首先你需要想到将问题转化到 \(\mathbb{F}_{2}\) 上的多项式,然后选择若干开关操作等价于乘上一些 \((1 + x^k)\) 状物,这个因为交换律所以顺序没有影响,那么在特征为 \(2\) 的域上我们自然考虑二进制进位相关,具体就是两个 \((1 + x^k)\) 可以合并成 \((1 + x^{2k})\) 状物,所以唯一分解之后每个因子只和奇数部分有关,形成若干不交的链。只有同一条链上的才会互相进位什么的所以可以直接固定链顶的奇数。对一条链,考虑从低向高合并,分合并后能否形成单一连续子段讨论即可。需要考虑最后一个块 \([L,R]\) 它因为是 \(\bmod 2^L\) 所以可能会环绕回来重复计数,要对 \(R + 1\) 取 \(\min\)。
F 题貌似是很神圣的东西,我后面再看看。
A (构造、贪心、*700):
因为字符集大小只有 \(2\),所以可以将 0 视作空位 1 视作真正的元素,则 \(\text{dist}(S,T)\) 可以重新理解为 1 的移动距离之和。就是假设升序排列下,初始位置是 \(p_1,p_2,\dots,p_n\),最终位置是 \(q_1,q_2,\dots,q_n\),那么 \(\text{dist}(S,T)=\sum_{i=1}^{n} |p_i-q_i|\),这个正确性你考虑邻项交换+计算数轴上每个单位长度的系数即可。
所以我们求出当前的 1 在 \(A,B,C\) 三个串里面位置分别为 \(a_i,b_i,c_i\),这等价于简单货仓选址问题,直接令 \(X\) 中当前的 1 的位置为 \(a_i,b_i,c_i\) 的中位数即可。
时间复杂度 \(\mathcal{O}(n)\)。
B (构造、贪心、偏序、*1100):
首先从值域上考虑,如果对于一个 \(A_i\),所有 \(\sum_{j=1}^{n} [A_j \lt A_i] \lt A_i\) 那么肯定是无解的,所以判无解是简单的,可以直接值域上前缀和计数判定。然后这个是充分的,因为元素排列的唯一限制是值域上的偏序关系,所以可以直接对前缀建图然后类似 hall 的思路说明。
然后考虑如何构造,因为约束和实际元素的取值都是不降的,所以可以直接按照权值从小到大处理。当处理到 \(x\) 时答案中只有权值 \(\lt x\) 的元素,所以可以直接把所有 \(A_i = x\) 放到前面恰有 \(x\) 个元素的位置,这样:
- 新插入的每个 \(x\) 前面(严格)恰好有 \(x\) 个元素。
- 当前序列中所有元素均 \(\lt x\),所以前缀肯定都能算进贡献。
- 以后插入的元素必定 \(\gt x\),即使被插到某个 \(x\) 前面也不会对 \(x\) 产生贡献。
然后这个可以直接链表维护,只需要找插入位置之前的那个节点,所以直接有 \(p\) 表示链表此时从头开始恰有 \(c\) 个元素位于插入位置之前,处理 \(A_i = x\) 时只需要将 \(p\) 跳链表的 \(\text{next}\) 向后移动 \(x - c\) 步,均摊下来步数总和是 \(\mathcal{O}(n)\) 的,总时间复杂度 \(\mathcal{O}(n)\)。
C (构造、Ad-hoc、*2100):
先给结论:设字符串 \(S\) 的最短循环节长度为 \(d\),也即 \(S = P^{n / d},|P| = d\) 且 \(P\) 不可写成更短字符串的若干次重复,那么答案为 \(k = \frac{n}{d}\),一种一定合法的构造是,将整个字符串 \(S\) 重复 \(n\) 次。其长度为 \(n^2 \leq 10^6\),符合条件。
考虑断环成链,岛屿的位置可以用整数表示,相差 \(n\) 的两个位置对应同一个岛屿。对于字符 \(c\),一次操作会把位置 \(x\) 移动到 \(f_c(x) = \min \{y > x \mid S_y = c \}\),所以显然有 \(f_c(x+n)=f_c(x)+n\),也就是说,断环成链后所有人的相对运动仍然具有周期 \(n\)。
因为 \(d\) 是 \(S\) 的整周期,所以必定有 \(S_x=S_{x+d}\),因此对于任意字符 \(c\),都有 \(f_c(x+d)=f_c(x)+d\),并且任意多次操作的复合也保留这个性质。考虑初始位置 \(0,d,2d,\ldots,(k-1)d,k=\frac{n}{d}\),无论进行什么操作,这些人的位置始终两两相差 \(d\) 的倍数,并且模 \(n\) 后仍是 \(k\) 个不同的位置。因此不可能只剩下少于 \(k\) 个有人的岛屿,也就是 \(k_{\min}\ge \frac{n}{d}\)。
然后我们考虑证明构造的充分性,把依次选择 \(S_1,S_2,\ldots,S_N\) 这一整段操作看成一个复合变换 \(f\),对展开后的位置 \(x\in[0,n]\):
- 一共执行了 \(n\) 次操作,每次至少向右移动一格,所以 \(f(x)\ge x+n\);
- 从位置 \(n+1\) 到 \(2n\) 恰好又是一份完整的 \(S\),逐个走到这些位置一定能够完成这一段操作,所以 \(f(x)\le 2n\)。
令 \(h(x)=f(x)-n\),于是 \(x\le h(x)\le n\)。不断重复整段操作 \(S\),等价于不断迭代 \(h\)。因为 \(h(x)\) 是一个不小于 \(x\) 且不超过 \(n\) 的整数,所以每个位置至多经过 \(n\) 次迭代就会到达某个不动点,下面判断 \(h\) 的不动点是什么。
若 \(h(x)=x\),则 \(f(x)=x+n\),这一整段中共有 \(n\) 次移动,总位移也是 \(n\)。由于每次移动至少一格,所以每一次都必须恰好移动一格。这意味着从 \(x+1\) 开始连续看到的 \(n\) 个字符正好依次为 \(S_1,S_2,\ldots,S_n\)。换言之,将 \(S\) 循环左移 \(x\) 位后仍然等于自身。因此 \(x\) 必须是 \(S\) 的循环周期。反过来,如果循环左移 \(x\) 位后字符串不变,那么执行这一段操作时每次都只需移动一格,所以 \(h(x)=x\)。由于最短周期为 \(d\),在 \([0,n)\) 中的不动点恰好是 \(0,d,2d,\ldots,n-d,\),共 \(\frac{n}{d}\) 个。所以执行 \(S\) 共 \(n\) 遍以后,所有人都会到达这些不动点之一;而这些不动点上的人始终留在不同的位置。因此最终恰好有 \(\frac{n}{d}\) 个岛屿有人。结合下界可知,这就是最优答案。时间复杂度 \(\mathcal{O}(n^2)\)。
D (构造、Ad-hoc、*2300):
核心结论:一个新串 \(T\) 如果可以被生成,当且仅当对任意两个位置 \(1 \leq i \leq j \leq |T|\),都存在某个初始串 \(S_k\),使得 \(S_{k,i} = T_i,S_{k,j} = T_j\)。也就是 \(T\) 在任意两个位置上的组合,必须在某个初始串中出现过。
先考虑证明必要性:令一次操作生成 \(D = \text{maj}(A,B,C)\),固定两个位置 \(i,j\),则:
- 至少有两个输入串在位置 \(i\) 上等于 \(D_i\);
- 至少有两个输入串在位置 \(j\) 上等于 \(D_j\)。
而在三个输入串中,两个大小 \(\geq 2\) 的集合必定有交,因此至少有一个输入串在这两个位置上均与 \(D\) 相同。
所以,新串任意两个位置上的组合,一定已经出现在某个输入串内,它是有传递性的,不断向前追溯可以得到该组合一定出现在某个初始串中。故条件是必要的。
再考虑证明充分性,也就是详细分析传递的部分。令字符串长度为 \(L\):
- 对 \(L = 1\) 只能取 \(i = j = 1\),条件保证了某个初始串唯一字符等于 \(T_1\),所以可行。
- 对 \(L = 2\) 只能取 \(i = 1, j = 2\),条件直接保证存在一个初始串,与 \(T_1,T_2\) 相同。
- 对 \(L \geq 3\),任取一个位置 \(1 \leq k \leq |T|\) 删掉,在剩下 \(L - 1\) 个位置中,\(T\) 仍满足任意两个位置组合均在某个初始串内出现。根据归纳假设,可以通过操作得到字符串 \(U^{(k)}\),除位置 \(k\) 外均与 \(T\) 相同。那么任取三个不同的位置 \(1 \leq a \lt b \lt c \leq |T|\),分别构造 \(U^{(a)},U^{(b)},U^{(c)}\),对其取众数,在位置 \(a\) 只有 \(U^{(a)}_a \neq T_a\),另两个一定相同,此时 \(U^{(b)}_a, U^{(c)}_a\) 是众数,位置 \(b,c\) 同理,则三者取众数时恰为 \(T\)。
那么必定存在一种构造方式可以求出 \(T\),充分性得证。
实际实现只需要预处理 \(f(i,j,S) = 0/1\) 表示位置 \(i,j\) 是否能构成二进制状态 \(S\),求解复杂度 \(\mathcal{O}(nm^2)\),单次询问复杂度 \(\mathcal{O}(m^2)\),总时间复杂度 \(\mathcal{O}((n + q)m^2)\)。
E (生成函数、组合数学、Ad-hoc、*2700):
因为异或具有交换律,所以只要选取的开关集合相同,顺序不会有影响。令选取的开关上的值为 \(c_1,c_2,\dots,c_k\),那么可以将 \(B\) 视作一个 \(\bmod 2\) 的系数,所以根据这个特点,考虑构造符合上面交换律的在 \(\mathbb{F}_2\) 上的多项式 \(P(x) = \sum_{i=1}^{n} B_i \times x^{i-1}\),初始时有 \(P(x) = 1\)。而按下写有 \(c_i\) 的开关后 \(B_j \leftarrow B_j \oplus B_{j - c_i}\),这等价于 \(P(x) \leftarrow P(x)(1 + x^{c_i}) \pmod {x^n}\)。因此将所有 \(k\) 个选取的开关对应影响加进去就有 \(P(x) = \prod_{i \in S} (1 + x^{c_i}) \pmod {x^n}\)。因为多项式乘法同样有交换律所以在此过程中顺序不影响。
也就是说我们现在要求的变成了一个多项式前 \(n\) 项系数的可能方案数。因为是特征为 \(2\) 的域上的多项式,所以有 \((1 + x^k)^2 = 1 + x^{2k}\)。也即两个相同的 \(1 + x^k\) 可以直接合并为一个 \(1 + x^{2k}\)。那么考虑对每个指数 \(k\),将其写成一个奇数 \(\times 2^{v}\) 的形式,也就是将二进制表示下为 \(0\) 的极长后缀和前面的奇数部分分隔开。那么根据上面的进位逻辑,可以直接按照奇数部分 \(q = (2x + 1)\) 分隔为若干条不交的链 \(q, 2q, 4q, 8q, \dots, 2^k \times q\)。而不同链上的因子不可能相互进位。
因为对任意常数项为 \(1\) 的多项式都可以唯一表示为 \(\prod_{d = 1}^{n - 1}(1 + x^d)^{e_d}, e_d \in \{0,1\}\)。所以可以从低次项向高次项依次确定 \(e_d\),当处理 \(d\) 时更高次的因子不会影响到 \(x^d\) 的系数,故表示是唯一的。那么不同奇数对应的链必定占据互不相交的因子位置,可以自由组合,则可以对每条链单独计算方案数,最后乘起来。固定一个 \(q\),设正整数 \(L\) 使得 \(q \times 2^{L - 1}\) 是最大的 \(\lt n\) 的值,也即 \(q \times 2^{L - 1} \lt n \leq q \times 2^{L}\),令一个值 \(2^{v} \times q\) 出现了 \(c_v\) 次,那么我们可以选取其中的 \(0 \leq t_v \leq c_v\) 个,这等价于凑出一个二进制数 \(T = \sum_{v = 0}^{L - 1} t_v \times 2^v\) 的二进制表示。因为 \(L - 1\) 是满足 \(q \times 2^{L - 1} \lt n\) 的最大层数,所以所有超过第 \(L - 1\) 层的进位可以直接忽略。那么最终我们要统计的方案数就是 \(T \bmod 2^L\)。则问题变为,有 \(c_v\) 个权值为 \(2^v\) 的物品,求能得到多少种 \(\bmod 2^L\) 意义下的子集和。
具体来解决这个问题,我们忽略 \(c_v = 0\) 的位置,从低位向高位处理,类似于每次处理一整个连续子段,则只需要考虑从 \(i\) 推到 \(i + 1\) 的过程。考虑维护一个区间 \([0,r]\) 表示,将该连续段所有权值除以 \(2^l\) 之后可以取出的权值区间(因为是连续二进制数所以可以表示为区间)。但是新加进来 \(i + 1\) 这一层之后,假设这层现在的权值是 \(x\),数量是 \(c\),则原来的区间会变成若干个小区间的并,即 \([0,r] \cup [x,x + r] \cup [2x,2x+r] \cup \dots \cup [cx,cx + r]\)。如果 \(x \leq r + 1\) 那万事大吉因为 \(kx \leq (k-1)x + r + 1\) 所以新的范围还是连续的,直接令 \(r \leftarrow cx + r\) 即可。否则中间会出现空隙,由于当前段的所有取值都小于下一段的取值,所以每一个结果都能唯一分解为低位和高位的贡献,此时 \([l,i]\) 的选法对 \(i + 1\) 是独立的,所以可以直接给这个连续段乘上 \([l,i]\) 的贡献 \((r + 1)\),再从 \(i + 1\) 开一个新段接着算即可。需要注意的是,如果最后一段的 \(r + 1 \gt 2^{L - l}\) 那么需要截断多出来的部分,也就是用 \(r + 1\) 和 \(2^{L - l}\) 取 \(\min\)。整个处理过程是均摊 \(\mathcal{O}(n)\) 的。
时间复杂度 \(\mathcal{O}(n + m)\)。
浙公网安备 33010602011771号