0%

AGC043 简要题解

A - Range Flip Find Route

直接 dp,转移根据贪心显然 \[ f(i,j)=\min(f(i,j-1)+[(i,j)是墙][(i,j-1)不是墙],f(i-1,j)+[(i,j)是墙][(i-1,j)不是墙]) \] 不知道为什么只开到 \(100\) 还给了 \(2s\),还以为我 A 都想假了。

提交记录

B - 123 Triangle

牛牛题。

由于每次都是两个数的差的形式,所以我们把 \(1,2,3\) 变为 \(0,1,2\)。先考虑判答案的奇偶性,我们暂时把 \(2\) 改为 \(0\),显然不会影响奇偶性,这样可以发现差的绝对值等价于异或和。这样就可以考虑 \(a\) 中每个元素的贡献,不难发现 \(a_i\) 被算了 \(\dbinom{n-1}{i-1}\) 次,所以找出所有 \(a_i=1\) 的数,对组合数求和就知道了答案的奇偶性,计算组合数模 \(2\) 可以求出阶乘 \(2\) 的因子的次数。

然后如果答案是 \(1\) 就结束了,然后考虑判 \(0\)\(2\),注意到序列如果有 \(1\) 则答案一定不为 \(2\),因为某行如果有一个 \(1\),直到这一行都是 \(1\) 之前下一行一定也有 \(1\),而全部都是 \(1\) 话后面就都是 \(0\)

所以我们只需要考虑只有 \(0,2\) 的情况,发现还可以按照判奇偶性的方法再做一遍。

提交记录

C - Giant Graph

我觉得还是牛牛题,但是 zzz 说是水题,我菜死了/kk

我们不难发现选 \(x+y+z\) 最大的点一定最优,同时根据连边方式 \(x+y+z\) 相同的点之间不会连边。这样我们选择的点是可以递推出来的。

我们考虑把无向边变为有向边,让编号小的点向编号大的点连边,这样会形成一个 DAG。我们发现一个点最后会被选当且仅当其后继节点都没有被选。注意到这和公平组合游戏的又想图游戏完全一致,即如果不能向后走时必败,则这个点会被选当且仅当它是必败态。

注意到我们每一次移动只会有一维变化,所以这可以看作三个独立游戏的叠加,于是我们对每一张图都求出每个点 SG 函数,则答案为 \(\sum\limits_{SGA_i\oplus SGB_j\oplus SGC_k=0}10^{18(i+j+k)}\),这个是个异或卷积可以用 FWT 完成。但是我们发现一张边数为 \(m\) 的有向图游戏的最大 SG 值是 \(O(\sqrt m)\) 的,所以可以直接暴力枚举前两项,总复杂度 \(O(n+m)\) (求 SG 函数是线性的)。

提交记录

D - Merge Triplets

我们注意到如果某个 \(A\) 序列中满足某两项前一项大于后一项,则这两项一定在最终的排列中连续,特殊的,如果同时有 \(A_{i,1}>A_{i,2},A_{i,1}>A_{i,3}\),则这三项在最终的排列中连续。

我们把这种一定连续的长度小于等于 \(3\) 的元素缩为一段,那么我们一定有以下限制:

  • 对于每个长度大于等于 \(2\) 的段,段首元素最大。
  • 长度为 \(2\) 的段的数量不超过长度为 \(1\) 的段的数量,因为如果出现一个长为 \(2\) 的段,它所在的序列一定还剩下一个长为 \(1\) 的段。

假设我们已经知道了每个段内部的元素,我们注意到把这些段组合成合法(不能继续缩)的序列后,其形成的排列是固定的,该排列一定是按段首从小到大排序后依次连接形成的排列。进一步地,对于一种段的划分方式,其一定和一个合法排列对应,所以我们只需要对合法的段的划分方案计数。

\(f(i,j)\) 表示考虑了 \(1\sim i\),目前长度为 \(1\) 的组的个数减去长度为 \(2\) 的组的个数为 \(j\) 的方案数,转移考虑 \(i\) 和谁在一组,故有 \[ f(i,j)=f(i-1,j-1)+(i-1)f(i-2,j+1)+(i-1)(i-2)f(i-3,j) \] 答案就是 \(\sum\limits_{i\geqslant 0} f(3n,i)\),复杂度 \(O(n^2)\)

注意有的题解说要保证最后第二维是 \(3\) 的倍数,其实不是 \(3\) 的倍数最后方案数一定是 \(0\)

提交记录

E - Topology

请先保证正确理解题意。

先考虑给定绳子和点如何判是否合法,这里有一个结论:每个点分别做关于 \(x\) 轴的直线,我们从绳子上任何一个位置出发一直走直到回到这个位置,每经过某个点 \(u_i\) 所在直线的上半部分(这个点上方的部分)就写下一个 \(u_i\);经过下半部分则写下一个 \(d_i\),这样最终会形成一个字符串,情况合法当且仅当你可以通过连续消去两个相邻的完全相同的字符(字符下标也需一致)最后把这个字符串清空。证明考虑连续两个相邻的字符等价于绳子穿过了这个条线然后又绕了个弯从同侧回来,我们把绳子抽出来不会碰到任何点。

然后我们考虑判断无解,显然如果某个点合法但是存在其某个子集不合法则无解,下面的构造方式说明了充分性。

我们考虑找出所有极小的不合法集合,现在假设我们只考虑只有全集 \(S\) 不合法,任何一个子集都合法的情况,则我们递归构造:

  • \(|S|=1\) 则构造字符串 \(u_1d_1\)
  • \(|S|>1\) 取出点 \(1\),先从上面经过,即添加一个 \(u_1\),然后递归构造删掉这个点的集合,然后再从上面回来,即添加一个 \(u_1\),再从下面经过,添加一个 \(d_1\),然后我们对把刚才递归构造部分的字符串反过来再接到后面,最后再添加一个 \(d_1\)

不难发现,该字符串没有任何两个相邻且相同的字符,同时可以发现,如果删掉任意一个点,一定会导致某两个相同的字符连到一起,而根据我们的构造方式,断点处两端会一直被删除直到字符串被清空,所以这样是合法的。

考虑一般的情况,如果有多个极小不合法集合,则我们只需要把每个字符串拼到一起就可以了,但是要注意可能会经过不在当前构造集合内部的点,这时要只从同一边经过。可以发现这样也是正确的。

这样的总长度是 \(O(n3^n)\) 的(感觉由于只做极小的不合法集合远远到不了)。

提交记录

F - Jewelry Box

不会线性规划(网络流),先咕着。