ARC221

AtCoder Regular Contest++ 221

闲话

近期发挥最恶臭的一场比赛,\(\text{Perf}\) 不能说明我的抽象,仅从赛前预期是否达到的角度来看甚至没有达到 arc219 的水准。

开局发现 A 是并不简单的数论,一开始的切入角度正好是对的于是飞快秒掉了,估摸有个紫题难度,一看榜发现是首 A 意识到机会可能要来了,至少就当时看来,B 是复杂结构计数,D 是构造,局势一片大好。

然后呢,然后就开始搞抽象了,B 题想到图论建模后一直想不到将 \(a_i\) 相同的缩成一个点,因为它们的出边边集必定完全相同,导致我各种角度建图推出来的 DAG 容斥状物始终是和 SCC 内部实际连边结构有关的东西,都是指数级的根本优化不了,想到缩 SCC 后直接 DAG 容斥用斯特林数表示已经一个小时了。

一刻也没有为 B 题的崩盘哀悼,赶到战场的是 D 题!看了一眼 C 意识到应该是比较 typical 的数据结构优化 DP 状物,本来 AT 的 DP 结构刻画就不是我比较擅长的(这东西大概率没有人类能真的声称自己擅长,而且我比较神鬼二相性,不能保证稳吃,甚至不能把“做不做得出来”转化为“多久做出来”),然后这个题一看就是你不仅要刻画清楚维护的结构还要用依托大的来维护。鉴于我之前写个简单扫描线都能写一小时的智人事迹我选择开 D。简单看了一下第一反应是归纳构造,但是一直没有手玩出一个靠谱的策略,此时这个题目的逆天之处就体现出来了,难以剪枝导致我甚至无法通过打表给出 \(n \geq 4\) 的解,也就找不了规律,于是开始硬推,选择的切入角度是把 \(\pm 1\) 视作标号,然后从子树角度考虑每次把对称的偏序关系配平,则容易想到欧拉回路状物,但这个东西最终合并的时候会让叶节点出现矛盾,导致无法确保权值是一个排列,考虑硬修(其实这个时候从另一个角度看已经很接近本质了,如果能意识到直接交换叶子节点层和当前节点层的权值就能保证完备的话应该就切了)。

然而这个东西显然没法硬修,因为只知道调整是归纳地删圈,所以事实上解一车方程没法找到更多的可以用来限制回路形态的不变量,也不存在某个特定的等价类修好就行了,于是倒闭了,我已急哭,剩余的时间就一直在 C, D 之间来回切换,最后只会 C 的平方做法,遗憾离场。

我觉得这次给的反馈有一个相当重要的部分,它告诉我很多时候当你从某个思考路径上取得某些关键结论的时候,不一定直接要用这些结论硬去优化你目前这条路,而是停下来考虑从这个结论开始,尝试反解出之前你获得的条件是否有另外的,更自然的切入角度,使得这些你获得的条件能够以一个更恰当的方式串在一起,其实像 NOI2023D1T2,CTS2026D1T2 和 NOI2025D1T3 这种传统 CNOI 类的思维题更多的考察的就是这样一个获取结论后回溯的过程。这样一层一层去把结构真的理清楚,而不是定一个方向然后并不充分利用获取到的关键观察的策略肯定是更有利于做题的。

E 题是析合树,畏惧了...


A (数论、exgcd,莫比乌斯反演、*2200):

Clist 没那么高,貌似是一车人整场比赛全在刚这个题导致的。但我体感包括看别的老哥过这个题的速度,觉得应该值这个定数。

因为对两个一次函数的对应系数相加减,必定是不会影响其 \(\gcd\) 的,所以直接对 \(Ax+B\) 和 \(Cx+D\) 辗转相减可以最后化成处理 \(C = 0\) 的问题。

此时因为有 \(n = \sum_{d \mid n} \varphi(d)\),所以有:

\[\begin{align} \nonumber &\sum_{i=1}^{n} \sum_{k} [k \mid \gcd(Ax+B,D)] \times \varphi(k) \\ \nonumber = &\sum_{i=1}^{n} \sum_{k \mid D} [k \mid Ax+B] \times \varphi(k) \\ \nonumber = &\sum_{k \mid D} \varphi(k) \sum_{i=1}^{n} [k \mid Ax+B] \nonumber \end{align} \]

对后者直接 exgcd 即可。

记 \(V = \max\{A, B, C, D\}\),时间复杂度 \(\mathcal{O}(T \times (V + \tau(V^2) \omega(V^2) \log V))\)。

ac link


B (DP、组合数学、斯特林数、图论、*2400):

考虑如何判定 \(a\) 合法:令 \(t_i\) 表示 \(a_i\) 取值被确定的时刻,也即 \(a_i\) 是第几个被确定的,那么如果 \(j \in a_i\),则必定有 \(t_j \geq t_i\)。因为确定 \(i\) 时必定要用到 \(j\),对这样的 \((i,j)\) 考虑连边 \(i \to j\)。

那么可以将所有 \(a\) 相等的点缩成一个点,因为它们的出边边集必定是相同的。

再删去所有 \(a_i = 0\) 的点,并删去所有自环,那么此时可以保证 \(t_i\) 互不相同。此时若有环则必定无解,否则可以直接按照拓扑序来构造 \(a\)。那么转化为一个比较 typical 的 DAG 容斥计数问题,令 \(f_n\) 表示去掉 \(a_i = 0\) 所有点后,\(n\) 个点对应合法 DAG 的方案数。

考虑直接枚举存在 \(i\) 个 \(0\) 度点,已经划分为 \(j\) 个 SCC,此时划分 SCC 对应的方案数即为第二类斯特林数 \({i} \brace {j}\),那么剩下 \(n - i\) 个点之间连边是任意的,方案数为 \(2^{j(n - i)}\),转移容斥系数按照常规 DAG 拆贡献理解不难确定为 \((-1)^{j - 1}\)。则有 \(f_n = \sum_{i=1}^{n} \binom{n}{i} f_{n-i} \sum_{j=1}^{i} (-1)^{j-1} {{i} \brace {j}} 2^{j(n-i)}\)。

统计答案时直接枚举非 \(0\) 的 \(a\) 的数目,对应统计即可。

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

ac link


C (DP 优化、RMQ、*2800):

首先考虑朴素 DP:令 \(f(i,j)\) 表示从前缀选 \(i\) 个数,后缀选 \(j\) 个数是否可行。转移就直接考虑 \(f(i + 1, j) \leftarrow f(i, j)\) 或 \(f(i, j - 1) \leftarrow f(i, j)\),直接用 ST 表预处理/前后缀线性预处理均可做到 \(\mathcal{O}(1)\) 判定,那么总时间复杂度就是 \(\mathcal{O}(n^2)\),最后只需要看是否存在一个 \(f(i, n - i) = 1\) 即可。

然后你发现对于 \(i\) 固定的情形,合法的 \(j\) 是一个前缀。那么套路地我们考虑换维,记 \(g_i\) 表示最大的 \(j\) 使得 \(f(i,j) = 1\),则 \(g\) 的图像必定是符合二分性的,可以对每个 \(i\) 考虑将求 \(\max j\) 换为二分判定问题。

第一种情形是由 \(f(i - 1, j)\) 转移而来,此时已有集合为 \(S = a_{[1, i - 1]} \cup a_{[n - j + 1, n]}\),可以直接维护当前集合的 \(\min\) 和 \(\max\),判定直接看 \(g_{i - 1} \geq j \wedge a_i \notin [\min(S), \max(S)]\)。上述两个量都是可以平凡地用前后缀 \(\min, \max\) 来 \(\mathcal{O}(n) - \mathcal{O}(1)\) 维护的。

第二种情形是由 \(f(i, j - 1)\) 转移而来,这个难搞哦你发现它有后效性,但因为转移本质上是一个取最值的过程所以时间顺序没有影响,所以考虑先统一处理完第一类情形的转移再来搞第二类转移,显然第一类合法的 \(j\) 依然是一个前缀,则可以 \(\mathcal{O}(\log n)\) 地二分求出最大的 \(j\),记为 \(k\)。

那么此时就要二分第二类情形的 \(j\),看 \(f(i,j)\) 是否能从 \(f(i, k)\) 转移而来,令 \(S_p = a_{[1, i]} \cup a_{[p, n]}\),那么限制就是 \(\forall p \in [j, n - k], a_p \notin [\min(S_p), \max(S_p)]\),也即给定最值限制的情况下,我们判定一个区间能否从右往左地加进来。

这个依旧不好做,考虑在 DP 之前先枚举刚开始选的是哪两个数,去掉之后再 DP,这样任意一个数都能被分成加到头、尾和扔掉三种,那么一个区间可以从右往左加入当且仅当没有第三类数,且第一类数严格递增,第二类严格递减,那么当给定最值限制时,只需要额外看末尾的一类/二类数是否满足限制即可。这些都是可以预处理的,求出所有第一类转移之后倍增处理即可。

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

ac link


D (构造、Ad-hoc、*2900):

二叉树让我们自然地想到了递归构造,为了减少讨论,不失一般性地设左子树和比右子树和少 \(1\)。

注意到对于 \(\{1, 2, 7, 5, 6, 3, 4\}\) 这组 \(n = 3\) 的可行解,对称位置上权值之和均为 \(2^n + 1\)。这个性质和递归构造下,两棵对称合法子树权重也应当相同的思路是一致的,考虑以其为不变量,扩展到 \(n\) 更大的情形。

进一步构造后发现,对 \(n = 4\) 有合法解 \(\{1, 2, 15, 3, 8, 9, 14, 12, 13, 10, 11, 6, 7, 4, 5\}\) 是合法的,观察到的规律是两棵子树的非叶子节点权值 \(+1\),叶子节点 \(+ 2^n - 1\)。直接展开来算就会发现这样必定是符合条件的,那么直接增量构造即可。

证明:

考虑重新描述上面构造:令 \(T\) 为 \(n - 1\) 的答案,先将根节点的左右子树均写为 \(T\)。然后:

  • 将根节点填为 \(1\);
  • 对左子树,将所有叶节点权值 \(+ 2^{n - 1} - 1\),非叶子节点 \(+1\);
  • 对右子树,将所有叶节点权值 \(+1\),非叶子节点权值 \(+ 2^{n - 1} - 1\)。

现在左右子树权值之差为 \(2^{n - 1} - 2\),因为叶节点比非叶节点多一个,所以相当于多加了一个 \(2^{n - 1} - 1\) 少加了一个 \(1\)。并且多用了一次 \(2^{n - 1}\),而这个数此时就是右子树的根节点,那么直接将右子树根节点改为 \(2^{n - 1} - 1\) 也就是没用过那个数,现在差值恰好就是 \(1\) 了。

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

ac link


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