ARC207
AtCoder Regular Contest++ 207
闲话
第二场 VP,首次在赛时环境下自己搞出银牌题。
A 像是一个策略刻画题,我不懂太多套路所以直接从贪心的角度分析,然后得到一个可以把 \(X\) 的值域缩减到 \([0,\binom{n}{2}]\) 的观察之后,可以进一步把 \(\min\) 相关的代价计算转化成 employ 类似的代价延迟确定的结构。
B 是比较简单的构造,大概就是因为只走至多两条边所以容易想到二分图,那么肯定是交替染色,对每个点的邻域大小定为 \(n/2\),这样可以完全对称地构造,进而你发现两侧都要分别划分为两个子集,这样走第二条边的时候可以交替走过去使得总数相等,那么可以直接取一部分大小为 \(1\) 另一部分 \(n / 2 - 1\),这样可以直接对大小为 \(1\) 的点向另一个子集所有点连边,另一个子集做类似于缺一连边的东西即可。
然后你注意到 C 是神秘数据结构最优化问题,D 是博弈,E 是构造,因为是 VP 所以我们考虑 E。
一开始的思路是刻画最后一次操作,肯定有 \(s_a = s_n = t_n\) 且 \(t_{[b, n - 1]} = s_{b + 1, n}\) 状物。然后注意到是 \(n + 1\) 次操作所以我们肯定优先考虑重构整个串一类的操作从而得到正确的 \(t_{[b,n-1]}\) 而不是若干次单点修改。进而你发现只需要用一开始用一次操作使得 \(s_1 \neq s_2\),就可以直接用这两个字符生成 \(t_{[2,n-1]}\) 的部分放在最尾部,此时只需要考虑最后的 \(s_1 = t_1\) 以及 \(s_n = t_n\) 的问题。找到此时等于 \(t_1\) 的 \(s_1,s_2\) 中的那个位置,对它操作一次使其保留并复制到末尾,因为另一个位置被删掉了所以此时只需要解决 \(s_n = t_n\),也就是 \(s_1 = t_n\) 的问题。这个其实只需要找到最后的一个 \(s_i = t_n\) 的位置,然后操作 \((i,i+1)\) 即可。这是因为 \(i\) 以后的所有位置都是相同的取值,所以直接操作一次对于 \([i + 1, n - 1]\) 不会有任何影响。
A (DP、二分图、组合数学、*2400):
这真不简单吧。
首先我们分析最优的策略是啥样的,从而找出判定这个计数结构的充要条件。如果能用一个更小的代价解决一个位置使得其他位置权值 \(-1\) 那么必定不劣的。所以肯定是按照 \(a_i\) 从小到大排序,从前往后取。
然后你注意到这样每次对后缀的影响是整体 \(-1\),换言之每个点取值范围是 \([a_i,a_i - (i - 1)]\),又因为如果一次操作中某个点 \(j\) 被 \(-1\),那么从 \(j\) 开始的整个后缀都会 \(-1\),所以至多有 \(\mathcal{O}(n)\) 个独立的决策点。这也就是说,抛开 \(a_i\) 原来的差值,实际有效的权值种类只有 \(\mathcal{O}(n^2)\) 级别。那么我们考虑令 \(X \leftarrow \sum_{i=1}^{n} a_i - X\),则 \(X \gt \binom{n}{2}\) 必定无解。那么实际上问题就变成了有多少种 \(a\) 的重排 \(t\),使得 \(\sum_{i=1}^{n} \min(t_i,i - 1) \leq X\)。
这个就很容易 \(\rm DP\) 了,考虑这个 \(\min(t_i, i - 1)\) 的组合意义可以看成是一张二分图上,左部点 \(a_1,a_2,\dots,a_n\),右部点 \(0,1,2,\dots,n-1\),一组匹配的代价为所有匹配边的代价之和,一条匹配边的代价为两个顶点权值的 \(\min\)。你要求出代价不超过 \(X\) 的完美匹配数量。那么可以直接把 \(2n\) 个点拿出来从大到小排序得到 \(w_1,w_2,\dots,w_{2n}\),设 \(f(i,j,x,y)\) 表示考虑前 \(i\) 个点,总代价为 \(j\),左右部分别剩余了 \(x,y\) 个未匹配点的方案数。以当前点为右部点为例:
- 如果当前点和前面某个点匹配那么 \(y \times f(i,j,x,y) \to f(i+1,j+w_i,x,y - 1)\)。
- 如果当前点等后面某个点匹配那么 \(f(i,j,x,y) \to f(i + 1, j, x, y + 1)\)。
对 \(x\) 是同理的,这样直接做是状态数 \(\mathcal{O}(n^5)\),转移 \(\mathcal{O}(1)\) 的,你卡卡常数可能可以冲过去,更优的思路是考虑到前 \(i\) 个点中左右部点数目都是确定的,不妨记为 \(c_0(i),c_1(i)\),同样拿右部点举例,因为有 \(x\) 个左部点未被匹配所以存在 \(c_0(i) - x\) 条匹配边,那么 \(y = c_1(i) - (c_0(i) - x)\),所以事实上不需要记录 \(y\),只要预处理 \(c\),然后 \(i,x\) 确定了当场算就可以了。这样状态数变为 \(\mathcal{O}(n^4)\)。
B (构造、Ad-hoc、图论、*1900):
这玩意是不是比 A 简单多了。
首先看到约束是走至多两条边,大概思路就是类似于 [CSP-S 2022 T1] 那种类似于 meet in the middle 的东西。实际上这个结构更简单因为只有 \(2\) 所以可以考虑构造二分图然后对称地连边。
然后你考虑找规律,找到这个二分图的特殊性质,发现如果直接把二分图左右两边划成两个集合是不好做的,你无法确认一个点走到另一侧再走回来的可能取值之和。但比方说将图划分为四个集合 \(L_1,L_2,R_1,R_2\),规定从另一侧走回来的时候不能走回原来那个集合,就同样可以在一侧内对称构造。
那么可以先尝试令一个集合中只有单点,如果不行就考虑增量构造或者更复杂的 \(\rm DP\)。先思考偶数个点的情形,假设左部点 \(1, 2, 3, \dots, n/2\),右部点 \(n/2 + 1, \dots, n\),那么注意到一个按照增序处理一个按照降序处理可以至少将单个顶点的,距离为 \(1\) 的约束满足,所以把 \(1\) 和 \(n\) 单独拿出来,分别和 \(2, 3, \dots, n /2\) 以及 \(n/2 + 1, \dots, n - 1\) 连边。
再来考虑第二层的限制,注意到中间两排的权值在对角线上的和是一定的,就是说 \(L_i + R_{n/2 - 1 - i}\) 是相同的,由此可以想到将对角线上的连边关系去掉,即对于标号为 \(x\) 的点仅不连接 \(n + 1 - x\) 从而解决 \(1\) 和 \(n\) 起点的两层的影响。那么问题解决了。
总结就是:
- 对 \(1, n\) 分别与 \(u \in [2,n/2], v \in [n/2+1, n - 1]\) 连边。
- 对 \(u \in [2, n / 2], v \in [n/2 + 1, n - 1]\),如果 \(u + v \neq n + 1\) 那么连边 \(u,v\)。
证明就是比较typical的部分,因为取值是连续段就是若干个等差数列和加起来,略去,赛时交一发或者写个拍就够了。
再考虑奇数情况,其实就是把偶数部分的 \(X = \binom{n + 1}{2} - (n + 1)\) 转化为 \(X = \binom{n + 1}{2} - n\),这个显然吧,就是你考虑加入 \(n\) 这个点到原来 \(n - 1\) 对应偶数构造的影响,他其实就等价于在对角线的斜上方加入一个单一的单元格,那么其余向下偏移一格就是对的。具体就是令 \(n\) 和 \(1, (n - 1) / 2 + 1, \dots, (n - 2)\) 连边即可。
时间复杂度 \(\mathcal{O}(n^2)\)。
E (构造、Ad-hoc、*3700):
大的要来了,头一回解决的银牌题。
这题主要有三个难点,第一个是根据 \(\mathcal{O}(n)\) 次操作限制想到可以重构 \(s\),第二个是一车边界,第三个是对最终 \(s_n \neq t_n\) 的情形需要用类似字符串的角度去思考。评为银牌题可能还有一个原因是前面 C,D 两个题过于费时间了。
首先因为字符集大小只有 \(2\),又可以至多操作 \(n + 1\) 次操作,容易想到保留两个位置 \(i,i+1\) 使得 \(s_i \neq s_{i+1}\),将他们提到最前面,然后利用这两个字符生成剩余 \(n - 2\) 个位置,对应 \(t\) 字符串内长度为 \(n - 2\) 的某个连续子段。大概就是如果 \(t_i = s_1\) 那么利用 \(s_1\) 操作将其复制到末尾,否则用 \(s_2\) 操作即可,具体地:
- 如果 \(s_1 = s_n\) 那么只需要用一步操作找到一个 \(s_i \neq s_1\) 也即 \(s_i = s_n\) 然后操作 \((i,i+1)\) 即可。
- 然后你考虑如何将 \(s\) 用 \(n - 1\) 次操作变为 \(s_1 + s_n + t_{[2,n - 1]}\),这个可以直接考虑如果 \(t_i = s_1\) 那么操作 \((1,2)\),否则假设此时 \(s_n\) 实际位置在 \(i\) 就操作 \((i,i-1)\)。
然后考虑如何生成 \(t_1,t_n\),首先是 \(t_1\),直接保留 \(s_1,s_n\) 中等于 \(t_1\) 的,另一个删除。此时如果 \(s_1 \neq t_n\) 也即 \(s_n \neq t_n\),则可以直接找到最右侧的一个 \(s_i = t_n\) 然后操作 \((i,i+1)\)。这个可以从复原后反推回来,因为这是最右侧的 \(s_i = t_n \neq s_n\) 所以后面是一整个权值相同的连续段,也就是 \(t_{[i + 2, n - 1]} = s_1^{n - i - 2}\),也即 \(s_1\) 复制 \(n - i - 2\) 次形成的字符串。所以这样操作一次对后面任意位置都是没有影响的。
根据上面每一步的操作条件取反即可得到所有无解条件。时间复杂度 \(\mathcal{O}(n)\)。
浙公网安备 33010602011771号