ARC222

AtCoder Regular Contest 222

闲话

前段时间进行了一个药的换,起因是状态好一些了,目的是把一些白天嗜睡效果过于逆天的药换掉不然后面根本学不了一点。结果一开始给的交叉加减过于激进,喜提振碧路七天大礼包,等恢复人形已经有 \(\mathcal{O}(n)\) 天没回学校,但是只有 \(\mathcal{O}(1)\) 天期末考试。俺寻思俺这状态去高三约等于直接进入大专,于是立刻选择开证明准备休一年再说。

在此期间打了上面两场 ARC,做出了若干抽象奇异搞笑操作包括但不限于一个小时写不对线段树上二分等等,这集神了。

到这场已经恢复人形,能感受到注意力一定程度上已经回来了,配合草稿纸一点一点递推是能解决一些比较复杂的问题的。下一场实时的中高难度比赛要到下周四的 Order Capital Round 2,利用这场应该能检验脑子到底回没回来。

悲报:Order Capital Round 2 开小号被抓,现在只剩下一个IM号。不过场上一直过到 G,脑子估计是回来了。

说回到比赛,A 本来是送的,赛时没有注意到关键性质导致弄了一个优先队列的多一只 \(\log\) 难写做法,\(2 \ \text{min}\) 能过的题硬是等到 \(13 \ \text{min}\) 才获得一个能过的解法。B 分讨一个地方忘了开 long long 导致一发罚时,C 没想清楚折线的具体形态导致以为是四联通状物并通过了所有样例,交上去发现 AC 1 WA 36 你搁这说梦话呢,仔细想了一下应该是斜线,要转一下分两个方向 DP 才是对的,再吃一发罚时。

此时有十分甚至九分红温,看不出 E 就是根号分治 FWT 的 trick 于是开始硬想此时仅 \(1\) 人通过的 D,立刻想到转移过程只与最后 \(9\) 位的决策有关所以应该是状压 \(\mathcal{O}(n) \times 2^9\) 状物,但是因为进位所以可能会出现恰好要比两个 \(\text{DS}(p + 1)\) 状物,到这里已经红透了,想到的是可以代价延迟计算,开一个 pair 记延迟的进位后产生的答案和实际的答案,很麻烦写出一车细节但还好最后还是通过了。

看了一眼榜感觉优势不在我,最坏情况下如果要守住 \(2800\ \text{Perf}\) 那么 C 和 E 都是要切掉的,先写一下斜线的 DP 一脚踢死了 C,回头一看 E 数据范围 \(m \leq 20\) 时限 \(3\text{s}\) 然后立刻意识到所有类型的值出现次数之和是 \(\mathcal{O}(n)\) 的可以直接根号分治,绷不住了感觉自己就是纯糖,去网上贺一个比较快的 FWT 板子过来,卡卡常就过了。

感觉主要的问题是急,一吃罚时就开始不停地红温,导致有很多可以用观察在前期就简化掉的东西抓不住最后白白送走大量优势。然后一旦意识到自己开始丢优势就会更急着想翻回来,导致爆更大的问题。


A (贪心、构造、*900):

可以直接分析得出答案序列要最小化那个东西必定等于 \(\max\limits_{1 \leq j \leq m} (R_j - L_i + 1)\)。

像这种两侧有限制要求某个量最小的情况,考虑从两边直接夹到一个定值上去。

至少是这个数是显然的,任意一个极长的,颜色不同的区间长度均为这个数,为了满足其中颜色两两位置不同必定要大于等于这个数。

构造性地证明至多是这个数:令上面那个数为 \(t\),那么可以有答案序列 \(A_i = ((i - 1) \bmod t) + 1\),容易发现对 \(\leq t\) 的任意一个约束都满足条件,所以必定是一组合法的构造。

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

ac link


B (贪心、分类讨论、*1700):

有两个观察是你需要注意到的:

  • 获胜者必不可能相邻。
  • 同类型获胜者的边界可以共享。

这启发我们类似于缩极长同色段处理,考虑分只有 \(1,2,3\) 种类型的获胜者,最后取 \(\max\)。

一种

假设只有 P 获胜,那么需要 \(k + 1\) 个 R 和 \(k\) 个 P,所以答案是 \(\min(a - 1, c)\)。

对剩余两种同理计算即可。都是 \(\mathcal{O}(1)\) 的。

两种

假设还是 P 和 S 获胜,那么分别设胜者有 \(k_P\) 和 \(k_S\) 个。

总共需要的 R 有 \(k_P + 1 \leq a\),需要的 S 有 \(k_S \leq b\),需要的 P 有 \(k_P + k_S + 1 \leq c\),整理一下可以得到最大获胜人数为 \(\min(a + b - 1, c - 1)\)。

剩下两种获胜情形是完全对称的,同理计算即可。

三种

这个就比较典了,不确定出题人是不是为了这碟醋包的饺子。

对于 R 有 \(k_R + k_P + 1 \leq a\),对于 S 有 \(k_S + k_R + 1 \leq b\),对于 P 有 \(k_P + k_S + 1 \leq c\),简单的线性规划问题,换元得到答案为 \(\min\{a + b, b + c, a + c, \left\lfloor \frac{a + b + c}{2} \right\rfloor\}\)。

总时间复杂度 \(\mathcal{O}(1)\)。

ac link


C (博弈论、DP、*1900):

首先因为总回合数 \(2 \times 10^{10}\) 是个偶数,所以游戏结束后 chip 所在的位置 \((r, c)\) 与初始位置 \((h,w)\) 的奇偶性必定是相同的,即 \((r + c) \bmod 2\) 和 \((h + w) \bmod 2\) 相同,也就是说 A 真正要染色的位置全都满足与 \((h,w)\) 的奇偶性相同。又因为 A 只能 L/R 操作而 B 可以 U/D/L/R 操作,所以 A 实际上要干的事是每回合强行将 B 逼进一个特定的列,使得 B 无论往哪个方向走都会走到 A 提前染白的位置上。

可以猜测 A 要将 B 逼到的位置必定是一条轮廓线,如果不是那么可以由多条不交轮廓线复合而成但我们先认定为一条,不充分再考虑进一步构造。不失一般性我们设它是一条斜线 \(\{c_n\}\),那么必定有 \(|c_r - c_{r - 1}| = 1\) 并且只需要染白所有形如 \((r, c_r - 1), (r, c_r + 1)\) 的位置。

由于初始时必定在这个折线上,所以考虑证明每一步 B 上下左右走均无解即可。如果向左或右那么必定走到一个 \((r - 1, c_{r - 1} \pm 1)\) 或者 \((r + 1, c_{r + 1} \pm 1)\) 上,这都是染白的位置,所以必定不可行。否则上下走就走到自己这一列染白的两个位置,同样是无解的。又因为无论何时 B 必定踩在 \((r', c_{r'} \pm 1)\) 上所以只需要反向操作一步即可重新把 chip 推回轨迹 \((r', c_{r'})\) 上。那么一条轮廓线就是充分的。

所以现在问题转化成,找一条符合上面要求的斜线,使得沿途染色总代价 \(\sum_{r=1}^{n} (A_{r,c_{r}-1} + A_{r, c_{r} + 1})\) 最小。这个是简单 DP,考虑设 \(f(i,j)\) 表示从第一行走到第 \(i\) 行,且在第 \(i\) 行时落在第 \(j\) 列的最小代价,有 \(f(i,j) = A_{i,j - 1} + A_{i,j + 1} + \min\{f(i - 1, j - 1), f(i - 1, j + 1)\}\)。以及 \(g(i,j)\) 表示从第 \(n\) 行走到第 \(i\) 行第 \(j\) 列的最小代价,转移是完全对称的,这样合并答案时只需要考虑当前这一步走到 \(j - 1\) 还是 \(j + 1\),分别对应了 \(f(i, j - 1) + g(i, j - 1) - (A_{i, j - 2} + A_{i, j})\) 和 \(f(i, j + 1) + g(i, j + 1) - (A_{i, j} + A_{i, j + 2})\)。

总时间复杂度 \(\mathcal{O}(n^2)\)。

ac link


D (状压DP、贪心、*2700):

注意到 \(A_i, B_i \leq 10^9 - 1\),这代表每次操作除开进位以外至多影响到长度为 \(9\) 的后缀。

所以可以将 \(X_i\) 分为两部分,后缀 \(R_i = X_i \bmod 10^9\) 和前缀 \(P_i = \left \lfloor \frac{X_i}{10^9} \right \rfloor\),那么递推过程为 \(10X_{i-1} + T_i = 10(P_{i - 1} \times 10^9 + R_{i - 1}) + T_i = 10P_{i - 1} \times 10^9 + (10R_{i - 1} + T_i)\),其中 \(T_i \in \{A_i, B_i\}\),即你这一步选的那个数。进一步地,令 \(v = 10R_{i - 1} + T_i\) 那么进位部分 \(d = \left\lfloor \frac{v}{10^9} \right\rfloor\),新的后缀为 \(R_i = v \bmod 10^9\),新的前缀为 \(P_i = P_{i - 1} + d\)。

从这里就可以看出,每次 \(\times 10\) 相当于把低位向高位推,那么任意一步的决策,经过 \(9\) 次 \(\times 10\) 之后就会完全进入前缀,不会对此时的后缀产生影响。所以此时后缀 \(R_i\) 的取值实际上仅仅由最近 \(9\) 次选择决定,这个是可以状压的。考虑对任意一个状态 \(S\),因为其对应的后缀是唯一固定的,所以只需要在此基础上找最优的前缀即可。

因为前缀十分巨大,所以只能记与数位和相关的信息。考虑进位 \(d\) 的范围,因为 \(A_i, B_i \lt 10^9\) 所以必定有 \(v \leq 10(10^9 - 1) + 10^9 - 1 \approx 1.1 \times 10^{10}\)。因此进位 \(d\) 的取值范围必定是 \([0,10]\)。

对于 \(d \leq 9\),\(P_i\) 实际上相当于在 \(P_{i - 1}\) 末尾直接加一个数字 \(d\),数位和增加 \(c\)。但如果 \(d = 10\),那么 \(10P_{i - 1} + 10 = 10(P_{i - 1} + 1)\),这就会导致有一个 \(+1\) 操作向更高位传递,如果 \(P_{i - 1}\) 末尾有连续的 \(9\) 那么数位和可能会变得更小。所以我们考虑 DP 时记录两个状态,一个是前缀 \(P\) 真实数位值,另一个是 \(P + 1\) 的数位和 \(-1\) 的值。具体地,令 \(f(i,S,x)\) 表示考虑前缀 \(A_{[1,i]}, B_{[1,i]}\),当前最末尾 \(9\) 次决策集合为 \(S\),对应前缀数值 \(+x\) 的数位和 \(-x\) 的最小值(\(x \in \{0,1\}\)),例如 \(f(i,S,1)\) 就表示进行到第 \(i\) 位,最后 \(9\) 次操作的决策集合 \(S\),对应的 \(\text{DS}(P + 1) - 1\) 最小值,其中 \(\text{DS}(u)\) 表示 \(u\) 的数位和。

转移是简单的,分有无进位讨论:

  • 无进位时 \(10P + d + x\) 相当于直接在前缀 \(P\) 末尾追加一个 \(d + x\),有 \(f(i,S,x) = \text{DS}(10P + d + x) - x = \text{DS}(P) + d + x - x = \text{DS}(P) + d = f(i - 1, S', 0) + d\)。
  • 有进位时 \(10P + d + x = 10P + 10 + (d + x - 10) = 10(P + 1) + (d + x - 10)\),等价于在 \(P + 1\) 末尾追加一个 \((d + x - 10)\),也就是 \(f(i, S, x) = f(i - 1, S', 1) + d - 9\)。

总状态数为 \(2 \times 2^9 \times n\),每次对于一个 \(S\) 的一类转移,其对应的 \(S'\) 是可以唯二确定 \(\mathcal{O}(1)\) 算出的,所以单次转移 \(\mathcal{O}(1)\),总时间复杂度 \(\mathcal{O}(n)\),带一个 \(2048\) 的常数。

ac link


E (根号分治、FWT、*2500):

题目要求的是对每一个 \(x \in [0, 2^m - 1]\),求出利用 \(\{A_n\}\) 至多能组成多少对异或和为 \(x\) 的二元组。

设 \(C_v\) 表示序列中值为 \(v\) 的元素的数量,分 \(x\) 是否为 \(0\) 讨论:

  • \(x = 0\):即求 \(A_i = A_j\) 的最大划分方案,即为 \(f(0) = \sum_{i = 0}^{2^m - 1} \left \lfloor \frac{C_i}{2} \right \rfloor\)。

  • \(x \gt 0\):因为 \(A_i \oplus A_j = X \gt 0\),所以 \(A_i \ne A_j\) 必定成立,这就意味着 \(A_i\) 的集合和 \(A_j\) 的集合是完全独立的。为了最大化配对数,对每一对满足 \(A_i \oplus A_j = x\) 的 \((A_i,A_j)\),能组成的最大配对数为 \(\min(C_{A_i},C_{A_j})\),可以从二分图角度去理解,如果满足 Hall 定理那么某个点集的权值必定会被其邻域分完,不满足的必定找不到任何一种构造条件分完,只能分系数为邻域大小的权值出去,所以答案为 \(f(x) = \frac{1}{2}\sum_{i=0}^{2^m-1}\min(C_i,C_{x \oplus i})\)。

直接算上面的式子是 \(\mathcal{O}(4^m)\) 的,会爆。考虑拆贡献,由 \(\min(A,B) = \sum_{k=1}^{+\infin}[A \geq k] \times [B \geq k]\),得到 \(f(x) = \frac{1}{2}\sum_{k=1}^{+\infin} \sum_{i=0}^{2^m-1}[C_i\geq k] \times [C_{i \oplus x} \geq k]\),注意到内层求和等价于序列 \(T_i = [C_i \geq k]\) 自己进行异或卷积后第 \(x\) 项的值。

那么事实上不需要枚举每一个 \(k\),考虑将 \(C\) 从小到大排序,那么 \(k \in [C_i, C_{i + 1})\) 对应的答案是相同的,因此可以利用差分序列 \(D_i = C_i - C_{i - 1}\),将上式简化为 \(f(x) = \frac{1}{2}\sum_{i=1}^{m} D_i \times (T \oplus T)[x]\)。

令 \(N_i\) 表示满足 \(C_{v} \geq C'_{i}\) 的不同下标 \(v\) 的个数,\(C'\) 是从小到大排序的 \(C\) 序列,因为总数是 \(\mathcal{O}(n)\) 的,我们考虑根号分治。那么:

  • 当 \(N_i \leq B\) 时,可以直接暴力卷积实现,时间复杂度 \(\mathcal{O}(N_i^2)\)。
  • 当 \(N_i \gt B\) 时,有效的项数很多不能直接暴力卷积了,考虑用长为 \(2^m\) 的 FWHT 直接做异或卷积,单次复杂度为 \(\mathcal{O}(m \times 2^m)\)。但又因为 FWHT 是线性变换,所以可以直接做一遍正向的 FWHT 将 \(T\) 变换到频域,然后频域内结果平方乘上对应系数 \(D_i\),最后一次 IFWHT 还原回来即可。

分析时间复杂度,由于 \(\sum_{i=1}^{m} N_i \leq n\),数形结合不难得到 \(\sum_{i=1}^{m} N_i \leq \sum_{i=1}^{m} D_i \times N_i = n\)。那么暴力部分就是 \(\mathcal{O}(B \times n)\),FWT 部分就是 \(\mathcal{O}\left(\frac{n}{B} \times m \times 2^m\right)\),平衡一下取阈值 \(B = \sqrt{m \times 2^m}\) 可以做到 \(\mathcal{O}\left(n \times \sqrt{m \times 2^m} + m \times 2^m\right)\),精细实现肯定跑不满,加上时限给的 \(3\text{s}\) 所以可以通过,可能因为取模要轻度卡常。

ac link


posted @ 2026-09-28 00:46  Twistedmind  阅读(4)  评论(0)    收藏  举报