AGC 题解合集
开个坑,估计过段时间就弃了()
由于是「题解合集」所以没有题面和代码。
施工进度(点击「✔」可以跳转):
编号 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
AGC001 | ✔ | ✔ | ✔ | ✔ | ||
AGC002 | ✔ | ✔ | ✔ | |||
AGC003 | ✔ | ✔ | ✔ | |||
AGC004 | ✔ | ✔ | ✔ | |||
AGC005 | ✔ | ✔ | ✔ | ✔ | ||
AGC006 | ✔ | ✔ | ✔ | ✔ | ||
AGC007 | ✔ | ✔ | ✔ | ✔ | ||
AGC008 | ✔ | ✔ | ||||
AGC009 | ✔ | ✔ | ✔ | - | ||
AGC010 | ✔ | ✔ | ✔ | ✔ | ||
AGC011 | ✔ | ✔ | ✔ | ✔ | ||
AGC012 | ✔ | ✔ | ✔ | ✔ | ✔ | |
AGC013 | ✔ | ✔ | ✔ | ✔ | ||
AGC014 | ✔ | ✔ | ✔ | ✔ | ||
AGC015 | ✔ | ✔ | ✔ | |||
AGC016 | ✔ | ✔ | ✔ | |||
AGC017 | ✔ | ✔ | ✔ | ✔ | ||
AGC018 | ✔ | ✔ | ✔ | ✔ | ✔ | |
AGC019 | ✔ | ✔ | ✔ | ✔ | ||
AGC020 | ✔ | ✔ | ✔ | ✔ | ||
AGC021 | ✔ | ✔ | ✔ | |||
AGC022 | ✔ | ✔ | ✔ | |||
AGC023 | ✔ | ✔ | ✔ | |||
AGC024 | ✔ | ✔ | ||||
AGC025 | ✔ | ✔ | ✔ | |||
AGC026 | ✔ | ✔ | ✔ | |||
AGC027 | ✔ | ✔ | ✔ | |||
AGC028 | ✔ | ✔ | ✔ | ✔ | ||
AGC029 | ✔ | ✔ | ✔ | ✔ | ||
AGC030 | ✔ | ✔ | ✔ | ✔ |
AGC001
AGC001C Shorten Diameter
枚举直径中点然后暴力统计不需要删掉的个数即可。
AGC001D Arrays and Palindrome
考虑每个奇数会让边数少 \(1\),所以如果有两个及以上的奇数就寄了。然后考虑整一个这样的构造:
奇数的情况是类似的。
AGC001E BBQ Hard
考虑组合意义,无非是从 \((-a_i,-b_i)\) 走到 \((a_j,b_j)\) 的方案数,直接按照组合意义写一个 dp 即可。
AGC001F Wide Swap
考虑令 \(q_{p_x}=x\),然后操作会变成每次如果相邻两个 \(q\) 的差 \(\geq k\) 则可以交换。不难发现这相当于钦定了若干组 \(p_i<p_j\),然后求字典序最小的 \(p\)。
然后我就不会了,写了个贪心拓扑排序发现过了,我也不会证正确性。
然后看题解看会了,正确做法是拓扑排序然后每次取最大的没有出度的点赋值。正确性可以考虑一个 \(\mathcal O(n^2)\) 的贪心做法:每次取出最小的未赋值的位置,然后把能到它的点提出来递归做,优化暴力模拟就是上述做法。
AGC002
AGC002D Stamp Rally
整体二分即可。
AGC002E Candy Piles
哈哈,被博弈杀了。
排序之后相当于去掉第一行或者去掉第一列。然后 \(f_{u,d}\) 表示用了 \(u\) 个行操作和 \(d\) 个列操作是否是先手赢,考虑一下组合意义发现相当于边框上都是 \(1\),然后每个位置后继是上面一个和右边一个。
然后编了一个用平衡树维护 01 交替序列的做法,发现巨大多难写就开始自闭了。
看题解发现做法非常高妙。打表观察一下发现如果不是边框之类的 border case 我们都有 \(f_{u,d}=f_{u+1,d+1}\)。证明可以手画一下不一样的情况发现都不合法。于是 \(f_{0,0}=f_{x,x}\),只需要找到最大的不在边框上的 \(x\) 算它的函数值即可,这个函数值可以 \(\mathcal O(1)\) 算。
AGC002F Leftmost Ball
特判掉 \(k=1\) 的情况,剩下的情况先钦定第二个球的出现顺序是 \(1,2,3\cdots,n\),最后只需要乘上 \(n!\)。然后注意到一个方案合法当且仅当第 \(i\) 个白球在第 \(i\) 个数第二次出现的位置前面,然后可以画出来这样一张图:
答案即往图里填排列使得 \(u\to v\) 则 \(p_u<p_v\) 的方案数。
注意到下面那一堆东西对答案的贡献只和第二排的点在前两排的相对位置有关,于是 \(dp_{i,j}\) 表示第一行考虑到了第 \(i\) 个数,第二行考虑到了第 \(j\) 个数即可。
AGC003
AGC003D Anticube
抄了个 PollardRho 过了。
看题解发现不需要真的分解出质因数。先筛掉 \(\leq \sqrt[3]{x}\) 的因子,然后剩余的至多有两个质因数,然后讨论一下发现可以 \(\mathcal O(1)\) 解决。
AGC003E Sequential operations on Sequence
发现只需要保留前缀单调栈当中的元素。然后维护一个序列 \(f\) 表示前 \(f_i\) 的数都出现了一次。剩下的注意到如果 \(x>m\) 则 \(x\bmod m\leq \frac x2\) 于是暴力维护 \(f\) 复杂度是对的。
AGC003F Fraction of Fractal
注意到如果矩形上下连通且左右连通则答案就是 \(1\),如果两个都不是则答案是矩形个数,剩下的只需要考虑上下连通的情况。发现答案可以写成矩阵快速幂的形式,然后就做完了。
AGC004
AGC004D Teleporter
相当于定向成内向基环树。注意到如果环的大小 \(>1\) 就寄了,于是一定是 \(1\) 到自己,剩下的构成内向树。剩下的从底向上贪心即可。
AGC004E Salvage Robots
脑子不清醒想了一万年,冷静了一下突然会了。
看成是出口在动,其能任意访问而不产生任何影响的区域是一个矩形,把这个矩形记成状态,然后转移的时候是枚举扩展一步然后得到没被干掉的个数的贡献。
AGC004F Namori
笑死,根本想不到。
先考虑树的情况,二分图染色,把染色为 \(1\) 的位置翻转颜色,然后问题直接变成了移动所有黑色的棋子到指定的位置的最小代价,直接对每条边统计贡献即可。偶环的情况类似,只需要解一个 \(\min |x-a_i|\) 的方程,这个显然 \(x\) 取中位数最优。
奇环相当于每次可以用代价新生成两个黑色或者删除两个黑色,然后类似上面做即可。
AGC005
AGC005C Tree Restoring
把直径拿出来考虑即可。
AGC005D ~K Perm Counting
容斥,然后每条 \(\bmod k\) 的链独立,分开算最后多项式乘法即可。每条链可以 \(dp_{i,j,0/1,0/1}\) 表示考虑了前 \(i\) 个位置,有 \(j\) 个位置不合法,当前位置是否还没用,下一个位置是否还没用。
AGC005E Sugigma: The Showdown
哈哈,又被博弈杀了。
考虑 A 如果能走到一个在 B 树上相距超过 \(2\) 的边就 win 了。然后注意到一个关键性质是没走到之前 A 最多只能走长为 \(2\) 的边,这导致 A 始终无法跨过 B,于是 B 的最优策略就是每次朝着 A 走。那么 A 能到一个节点当且仅当它到 A 的距离小于到 B 的距离且它的所有父亲都可达。对所有能到的节点算一下即可。
AGC005F Many Easy Problems
F 比 E 简单系列。
对每个点考虑贡献,无非是 \(\binom ni-\sum_v {siz_v \choose i}\),贡献是减法卷积的形式,多项式乘法即可。
AGC006
一场 AGC 出了 3 道联考题,一门三杰了属于是。
AGC006C Rabbit Exercise
注意到每次操作是交换差分数组。
AGC006D Median Pyramid Hard
二分答案,然后观察一下,发现形如 010101 的交错段每层都会往中间缩短 1,而形如 000111 的段是不变的。于是整个过程无非是距离中心最近的相同连续段把其他东西都干掉,找这个相同连续段即可。
AGC006E Rotate 3x3
每次操作是将 \(a,b,c\) 变成 \(-c,-b,-a\)。然后先把所有数归位,然后构造一下发现可以让两个距离为 \(2\) 的列同时取负:
然后只用统计奇偶性即可。
AGC006F Blackout
三染色,即如果 \(u\to v\) 则 \(col_v=col_u+1\)。然后对每个连通块考虑一下可能发生的情况:
- 三染色失败,则会变成完全图
- 三染色成功,且三种颜色都存在,则会变成三分完全图
- 三染色成功,但没有三种颜色,则不变
然后对每个连通块算一下即可。
AGC007
AGC007C Pushing Balls
一个简单的想法是对每个位置算期望经过多少次,注意到第 \(2i-1\) 和第 \(2i\) 条线段的出现次数是一样的,所以一起记为 \(f_{i,j}\)。枚举第一次操作将这个东西递归到子问题,可以得到转移:
然后思路就偏向了以为 \(f\) 可以算,打了个表发现 \(f_{i,1}=\frac{i!!-(i-1)!!}{2^ii!}\),然后就自闭了。转换思路发现题目保证了输入是个等差数列,这意味着 \(d_i+d_{2n-i}\) 是定值,然后注意到 \(f\) 也是对称的,于是其实只需要求 \(f\) 每一行的和。推一下转移发现是调和级数状物,暴力算即可。
AGC007D Shik and Game
单调队列优化 dp 即可。
AGC007E Shik and Travel
一个简单的想法是记录 \(f_{u,v}\) 表示在 \(LCA(u,v)\) 的子树当中进到 \(u\),从 \(v\) 出去的最小代价,二分答案之后就只需要记录是否合法,于是转而对记录 \(f_{u,v}\) 表示在 \(u\) 的子树中进到 \(v\),中间过程合法,出去时的最小代价,注意到不需要考虑顺序,于是只需要考虑 \(v\) 在较小的子树中的情况,于是合法的状态最多只有 \(\mathcal O(\min(siz_l,siz_r))\) 个,根据 dsu on tree 的分析,这个是 \(\mathcal O(n\log n)\) 的,转移的时候双指针暴力即可。
AGC007F Shik and Copying String
考虑整个过程,无非是下面的每个位置匹配一个上面的位置。
不难发现这个匹配一定是从后往前贪心匹配且中间每一层都贪心走能走到的最靠后的位置。注意到这个贪心每次相当于所有拐点向左下移动一格,于是用队列维护这个贪心的拐点即可。
AGC008
AGC008E Next or Nextnext
考虑从 \(i\) 向 \(a_i\) 连边,会构成内向基环树森林,猜一下结论:每个环在最终方案中的相对顺序不会变。手画一下发现除了这个环长为奇数且没有挂树有一种其他的方案,其他时候都是对的。
然后没有树的环还可以两个拼接在一起,剩下的只用考虑带树的环的方案数。可以看成是环上相邻两个位置之间可以填一个新的位置
注意到这时候每个树一定都是一条链,那么答案是容易计算的。
AGC008F Black Radius
考虑如果两个点的某个邻域相等则发现它们中间的链上的节点都存在一个邻域相等,上面还存在一个代表点,它的某个子树没有被选完
把直径中点提成根,那么这个代表点一定在这两个点到根的路上,换句话说,这时候我们每个点半径的可行范围是「是他的邻域且不是他的父亲的邻域」的所有半径,这是一个前缀,于是现在就能做所有点都是关键点的情况了。
存在某些点不是关键点的时候每个点还要求「是他的邻域且是某个关键点的邻域」的半径,注意到这个关键点一定在它的子树里,于是合法的是一段后缀,这个也是容易求的,求交即可得到每个点是一段区间,对区间长度求和即是答案。
AGC009
AGC009C Division into Two
假设 \(a>b\),考虑所有 a 的位置。如果出现 aa
状的东西我们是不用管上一次 b 的出现位置的,否则一定是 ba
,dp 即可。
AGC009D Uninity
问题等价于求层数最少的点分树。考虑类似 CF1444E 做,给每个点分配深度,方案合法当且仅当任意两个深度相同的点的路径上存在一个更浅的点。考虑贪心把每个点深度取成仅考虑子树的最小深度一定是最优的(证明同 CF1444E),于是可以把所有限制压成 int 维护,由于深度是 \(\mathcal O(\log n)\) 的,于是复杂度是对的。
AGC009E Eternal Average
发现两个东西会影响当且仅当产生了进位,那么 dp k 进制下的进位状况即可。
AGC010
AGC010C Cleaning
随便选一个不为叶子的节点做根,然后 \(f_{u,x}\) 表示给 \(u\) 上面接一个权值为 \(x\) 的叶子之后 \(u\) 的子树能不能行,然后合法的 \(x\) 显然是一段区间,那么直接维护这个东西。然后考虑一下每一层的转移,假设往上面接一个权值为 \(x\) 的叶子,那么合法当且仅当存在一个序列 \(b\) 满足
- \(b_i\in [l_i,r_i]\)
- \(\sum b_i+x=2a_u\)
- \(2\max (b_i,x)\leq \sum b_i+x\)
后面两个条件其实相当于限制了 \(b_i\leq a_u,x\leq a_u\),前两个限制可以得到一个区间,取交集即可。
AGC010D Decrementing
被博弈杀+1
考虑如果没有除以 \(\gcd\) 则答案只和奇偶性相关,而除以奇数不会改变奇偶性。于是不难得到结论:如果某一时刻仅考虑奇偶性先手必胜则先手必胜,这是因为 \(n\geq 3\) 时先手总是可以让后手无法把所有数都变成偶数,\(n\leq 2\) 时简单讨论即可。
那么如果先手必败则先手一定需要除掉个偶数,否则后手必胜。那么必须是仅有一个奇数且不为 \(1\) 才行,也就是说只有一种决策,暴力递归这个决策。注意到每次递归会除以 \(2\),于是复杂度是对的。
AGC010E Rearranging
被博弈杀+1,nmd 怎么全是博弈/fn
考虑如果已知了最终序列,则后手的策略是简单的:有若干个「x 必须在 y 前面」的限制,那么直接拓扑排序,每次贪心选最大值即可。
于是如果 \(\gcd(x,y)\neq 1\) 则连边 \((x,y)\),先手的问题变成了给边定向成 DAG 使得最大拓扑序最小。对每个连通块分别考虑,假设它已经定向完成,则按照拓扑序取一外向生成树则构成一棵 DFS 树,于是最优的定向一定是某棵 DFS 树。发现不同 DFS 方式的影响只有环,而环上一定是贪心选较小的一边,那么直接每次选最小的未访问的出边一定是最优的。
最后模拟后手构造方案即可。
AGC010F Tree Game
我 杀 死 了 博 弈
为啥 AGC 永远是 E>>F 啊
这个对每个点求让人以为必有高论,但实际是在演。考虑 \(dp_u\) 表示仅考虑 \(u\) 的子树,从 \(u\) 出发能不能先手必胜。考虑一下转移,如果某个子树先手必胜则一定不会走这个子树,否则如果走过去那么后手的最优策略是走回来,原因是在那个子树里走没有前途。于是如果某个 \(a_v<a_u\) 则先手就能把后手耗死,否则先手就寄了,对每个点为根算一遍即可。
AGC011
AGC011C Squared Graph
UOJ#498 的弱化版,考虑对每对连通块算,假设分别是 \(G_1\) 和 \(G_2\)。那么首先如果 \(|G_1|=1\) 或 \(|G_2|=1\) 则为 \(|G_1||G_2|\),否则考虑可以在两条边之间反复横跳,于是只需要考虑路径长度的奇偶性,即
- 如果 \(G_1\) 和 \(G_2\) 都是二分图则答案为 \(2\)
- 否则答案为 \(1\)
大力统计即可。
AGC011D Half Reflector
麻了,什么阴间找规律题
打个表发现如果第一个位置是 B
则会从右边出来,证明可以归纳。然后再观察一下发现每次从右边出来的效果都是循环移位一次然后全部取反,然后暴力模拟就可以 \(\mathcal O(k)\) 了。
然后找找规律发现循环节非常短,具体地,链长不超过 \(2n\),环长是 \(1\) 或者 \(2\),于是 \(k\) 被 reduce 到了 \(\mathcal O(n)\) 级别,暴力模拟即可。
证明考虑形如 ABABAB
的段不会被破坏且每轮都会产生,于是最多 \(2n\) 轮就会进入循环。
AGC011E Increasing Numbers
按照某个经典套路把上升的东西拆成不超过 \(9\) 个连续的 111111
。假设用了 \(k\) 个这种东西,那么一定有
也就是说合法的充要条件是 \(9n+k\) 的所有数位和小于等于 \(k\) 且和 \(k\) 在模 \(9\) 意义下相等,而答案是充分小的,直接枚举答案即可。
AGC011F Train Service Planning
设 \(X_i\) 表示去程在第 \(i\) 个站点停留的时间(\(i\in [0,n-1]\)),\(Y_i\) 表示返程在第 \(i\) 个站点停留的时间(\(i\in [1,n]\)),然后设 \(x_i\) 是 \(X_i\) 的前缀和,\(y_i\) 是 \(Y_i\) 的后缀和,\(S_a=\sum a_i\),\(A_i\) 是 \(a_i\) 的前缀和,那么限制无非是
注意到 \(2a_i>k\) 则无解,于是所有对条件的变换都是合法的。化简一下,无非是在模 \(k\) 意义下有
设 \(z_i=x_i-y_{i+1}\),问题变成了如下的形式:
- 构造一个序列 \(z_{0\sim n-1}\),满足 \(z_i\geq z_{i-1}\),且 \(z_i\bmod k\in [l_i, r_i]\)
- 最小化 \(z_{n-1}-z_{0}\) 的值。
用 map 维护即可。
AGC012
AGC012B Splatter Painting
记录每个位置最后一次长为 \(d\) 的更新,然后枚举出边转移即可。
AGC012C Tautonym Puzzle
前面构造一个 \(1\sim m\),后面构造一个 \(1\sim m\) 的排列,则个数即排列的最长上升子序列的个数。
AGC012D Colorful Balls
连成一张图然后每个连通块分别做即可。同色连边只用和最小值连,异色则只用暴力从全局最小值和和最小值颜色不同的最小值和第三小值暴力连所有点即可。
AGC012E Camel and Oases
显然只有 \(\mathcal O(\log V)\) 个不同的可行的值,问题相当于去掉这个区间之后左右两边能不能用剩下的干掉。枚举左边用掉了哪些长度,然后对这种东西求出左右两边能干掉的最多个数即可。
复杂度 \(\mathcal O(2^{\log V})=\mathcal O(V)\)
AGC012F Prefix Median
考虑如果所有元素不同怎么判断一个序列是否合法。
倒着考虑整个过程,于是每次操作是删除两个位置。要求变成了某次新的中位数和之前的中位数原本是相邻的。
那么首先注意到如果相邻两次分别是 \(i,j\),那么 \((i,j)\) 区间内的一定已经删除了,而 \(j\) 一定还没有删除,于是可以得到每个位置删除时间的上下界,剩下的要求无非是每次删除的元素都合法(即和新的中位数不在同一侧),这个限制其实非常弱,只需要每次删除的东西在 \([a_{n-i},a_{n+i}]\) 即可满足。
于是变成了每次会增加两个合法位置,删除某些位置。只需要记录两边各有多少没有删除的位置即可转移,\(a\) 有相同的情况是类似的。
AGC013
AGC013C Ants on a Circle
根据链上的经典问题容易求出所有位置,只需要确定顺序。发现顺序不变,于是模拟出 1 所在的位置即可。
AGC013D Piling Up
我一开始的做法是钦定在 \([i,i+k]\) 当中然后答案就是 \(calc(k)-calc(k-1)\),但这个做法需要求反射容斥斜率是 \(\frac 12\) 的情况然后就寄了。
正确做法是允许出现所有的起点但钦定一定有一个前缀和为 \(0\),这样是容易转移的。
AGC013E Placing Squares
把贡献考虑成在区间中选两个数的方案数,于是只需要记录当前选了几个数,然后转移就是矩阵了。
AGC013F Two Faced Cards
考虑怎么判合法:当且仅当 \(\leq y_i\) 的个数不超过 \(i\)。
于是变成了:给出序列 \(f\) 和若干条线段,然后要求覆盖 \(i\) 的线段个数不能超过 \(f_i\),要求选出最多的线段个数。询问无非是把序列的一段前缀减一,然后重新询问答案。
考虑如下的做法:最开始先从大到小考虑,每次不合法干掉左端点最小的,然后处理答案的时候从小到大考虑,每次不合法干掉右端点最大的。
后面那个贪心显然是对的,考虑一下为什么前半部分这么做能保证后半部分不会出现调整的情况。假设后半部分干掉了 \(s\),而可以调整出 \(t\),那么一定有:
其中 \(j\) 是干掉 \(t\) 的位置。那么容易发现 \(i\) 一定在 \(t\) 的左端点前,\(j\) 一定在 \(s\) 的右端点前,于是在 \(j\) 的时候一定先干掉 \(s\) 而非 \(t\),于是不合法。
扫两遍贪心即可。
AGC014
AGC014B Unplanned Queries
发现一个合法的树上每个连通块都可以找到欧拉回路,于是每个点的度数一定都是偶数。而每个点度数都是偶数的树可以构造成菊花,于是这就是充要条件。
AGC014D Black and White Tree
先手的一个策略是每次选一个叶子结点的父亲,如果这个节点连接超过两个叶子就直接获胜,否则会删去这个点和它的叶子递归到子问题。
如果这个过程最后后手获胜则得到了一个匹配,则每次先手选完之后后手选匹配点即可获胜,于是这个过程是充要的。
AGC014E Blue and Red Tree
倒着考虑整个问题,于是每一次一定是选两个在两棵树上都有直接相连的节点合并起来,启发式合并维护一下即可。
AGC014F Strange Sorting
出这种阴间结论题能不能死一死😅
观察了一下发现场上唯一一个过题的是写的 Treap 模拟这个过程,数据水放过去了,这就是 AGC 吗爱了爱了。
从大到小依次加入每个元素,然后假设当前正在考虑 \([i,n]\) 的元素构成的子序列,\([i+1,n]\) 的还原次数是 \(T\),\(T-1\) 轮时的第一个元素是 \(f\),则:
- 如果 \(i,i+1,f\) 的出现位置构成 \((i,i+1,f)\) 的轮换则最后还原次数还是 \(T\),且第一个元素还是 \(f\)
- 否则还原次数是 \(T+1\),且第一个元素变成 \(i+1\)
模拟上述过程即可。证明大概是考虑每次操作不改变这个轮换的顺序。
AGC015
和上一场加在一起一车结论题给我做吐了。
AGC015D A or...or B Problem
首先注意到,如果 \(x<2^k\) 且 \([x,2^k)\) 中的所有数都可被得到,则答案直接为 \([x,2^k)\) 中的所有数,这是因为或不会进位且或只能更大。
现在考虑找到 \(l,r\) 第一个不同的位置 \(p\),然后把高于 \(p\) 的位置全部置 \(0\),然后分别考虑 \([l,2^p)\) 和 \([2^p,r]\)。
于是按照上述逻辑,左半边可达的就是 \([l,2^p)\),右半边则考虑找到 \(r\) 的第二个为 \(1\) 的位置 \(k\),于是右半边可达的无非是 \([2^p,2^p+2^{k+1})\),因为只用 \(2^p+2^k\) 和 \([2^p,2^p+2^k)\) 中的数即可达到,且因为没有进位所以就是答案。
最后考虑从左右两边分别去取一个的贡献,发现右边不会比 \(2^p\) 更优,于是这部分一定是 \([2^p+l,2^{p+1})\),将几个区间取并即为答案。
AGC015E Mr.Aoki Incubator
考虑对每个点求出它能将哪些点染色。注意到任意时刻染色的一定是一段区间,于是可以得到它能染色的是按照 \(V\) 排序之后的一段区间。那么假如能求出区间,之后的问题无非是选若干个区间覆盖 \([1,n]\),这个可以 dp。
考虑一下怎么求出区间,发现左端点是最小的满足 \(v_j\leq v_i,x_j\geq x_i\) 的点,右端点是最大的满足 \(v_j\geq v_i,x_j\leq x_i\) 的点。证明可以简单分类讨论。
AGC015F Kenus the Ancient Greek
第一问显然最优是斐波那契数。第二问打个表发现合法的东西做一次欧几里得之后的个数不多,暴搜就过了。
具体地,打个表会发现答案为 \(k\) 的所有对做一次欧几里得之后只有最多 \(k\) 种不同的,题解证明了这一点。
感性理解是为 \(k-1\) 的应该至少是斐波那契数 \(f_{k-1}\),而它能再来一次于是 \(x+y\leq m\),于是合法的对被限制在一个非常紧的区间里,而这个区间里的能为 \(k-1\) 的并不多。
AGC016
AGC016D XOR Replace
令第 \(n+1\) 个位置是所有数的异或和,则每次操作是交换第 \(n+1\) 个数和某个数,于是操作次数显然是连通块数加上边数。
AGC016E Poor Turkeys
假设钦定了某个东西最后出现,考虑怎么判合法。倒序扫整个序列,维护每个位置的删除时间。如果某一次两个东西都已经删除了则不合法,否则如果其中一个已经删除则可以得到另一个在这一次删除。
对每个 \(u\) 处理如果 \(u\) 最后删除 \(i\) 的删除时间,于是 \((u,v)\) 合法当且仅当 \(\forall i,f_{u,i}=f_{v,i}\),暴力枚举判断即可。
AGC016F Games on DAG
相当于问有多少种图满足 \(SG(1)=SG(2)\)。考虑按照 SG 函数的大小逐层考虑整张图,维护还没有钦定 SG 函数值的集合,边集的贡献是容易计算的,复杂度 \(\tilde{\mathcal O}(3^n)\)。
AGC017
AGC017C Snuke and Spells
只需注意到一个合法的序列一定是如下的形式:设值为 \(i\) 的有 \(a_i\) 个,则合法当且仅当所有 \((i-a_i,i]\) 不交且覆盖整个 \([1,n]\)。
于是答案的下界为没有被覆盖的位置的个数,然后仔细观察一下发现这个下界是可达的。
AGC017D Game on Tree
格林游戏。
AGC017E Jigsaw
类似联合省选 D1T3 的做法,先贪心出一个匹配,然后只需要处理环,发现环断成链后挂到合法的东西上面不会改变合法性,用队列维护即可。
AGC017F Zigzag
一个想法是按照线段的顺序逐个加入,这样状态量是 \(\tilde{\mathcal O}(2^n)\) 的,然后转移的时候类似轮廓线 dp 逐位转移即可做到 \(\mathcal O(nm2^n)\)
AGC018
AGC018B Sports Festival
每次干掉影响答案的那个。
AGC018C Coins
模拟费用流即可。
AGC018D Tree and Hamilton Path
考虑如果是圆排列则答案可以对每条边统计出贡献,同时可以统计出每条边的经过次数。
然后考虑肯定是干掉一条边,然后只需要对两边的端点 check 经过次数是否合法即可。
AGC018E Sightseeing Plan
考虑一条从左下到右上的路径权值是经过中间那个矩形的次数。
注意到这个次数可以拆解成进入的位置和出去的位置,且独立,于是对每个进入/离开的位置统计贡献即可。
AGC018F Two Trees
考虑把条件变成第二棵树上的权值和第一棵树恰好相反,于是一个想法是把权值对应成度数,在对应节点间连边求欧拉回路,不难验证所有合法都能构造。
AGC019
AGC019C Fountain Walk
无非是经过一个喷泉会有一定贡献,然后求个 LIS 即可。
AGC019D Shift and Flip
枚举最终移动的位置和移动到的最左的位置,然后模拟即可。
AGC019E Shuffle and Swap
考虑从 \(a_i\) 向 \(b_i\) 连一条边,然后注意到每个点的度数 \(\leq 2\),于是整张图是若干链和环的直和。
相当于一个大小为 \(i\) 的链/环有贡献,然后求所有分配方案的方案和。
注意到我们知道链的个数 \(m\),以及任意拜访的点的个数 \(n\),那求出链和环的生成函数之后答案无非是
多项式算一算即可。
AGC019F Yes or No
注意到如果已知当前还有 \(i\) 个 Y,\(j\) 个 N,则一定会选较大的那个。
然后在平面直角坐标系上把所有趋势画出来,发现每条路径的贡献是 \(\max(n,m)\) 加上经过 \(y=x\) 的次数,然后算一算即可。
AGC020
AGC020C Median Sum
只需注意到如果 \(x\) 可以则 \(sum-x\) 也可以,除非 \(x=sum\),所以从 \(\frac {sum}{2}\) 开始找第一个能做到的即可。
AGC020D Min Max Repetition
模拟即可。
AGC020E Encoding Subsets
考虑记忆化整个问题,注意到每次递归至少除以 \(2\),于是复杂度分析可以如下进行:取常数 \(c\),前 \(c\) 次递归最多有 \(\mathcal O(n^c)\) 个本质的状态,后面最多有 \(\mathcal O(2^{n/2^c})\) 个,取 \(c=3\) 发现可以通过。
AGC020F Arcs on a Circle
怎么又是你.jpg
考虑将整个环等分成 \(m\) 份并计算所有弧的端点在端点上的方案数 \(f(m)\),于是问题的答案无非是
注意到这个极限存在直接导出 \(f(m)\sim m^n\),也即 \(f(m)\) 是一个度数恰为 \(n\) 的多项式,插出最高项的系数即可。
AGC021
AGC021D Reversed LCS
把两边的序列都写在正串上,容易归纳证明选的一定是相同的点,于是答案等于最长回文子串的长度,dp 即可。
AGC021E Ball Eat Chameleons
考虑把整个序列规约成如下的最简形式:每个人的和都是 0 或者 +1,而且每个为 0 的都是 RB。
那么枚举有多少个为 1 的,然后合法当且仅当能找到一个 RBRBRB 的子序列,这个等价于每个前缀和都 \(\leq\) 某个值,于是翻折容斥,做完了。
AGC021F Trinity
把每个位置优先匹配行的限制,然后再匹配列的限制,然后先钦定每一行都有东西,于是每一行有一个前缀不能填列的限制,从后往前依次考虑每一列,然后维护当前还能放东西的行的个数即可 dp。
考虑一下转移系数,假设上一列有 \(j-k\) 个位置可以放,当前列有 \(j\) 个位置可以放,则系数无非是从 \(j\) 个位置中选 \(k\) 个的方案数,乘上这一列的的列的贡献,即 \(\sum_{x_{1\sim k}}x_1(j-x_k+1)\)。
考虑一下组合意义,无非是每有一对不在这段区间中的就贡献 \(1\),于是容易得到系数为:
化简可得为 \({j+2\choose k+2}\),于是转移是卷积,多项式优化即可 \(\mathcal O(nm\log)\)。
注意到每一列到下一列的贡献可以写成 \(F,F',F''\) 的线性组合且系数只有 \(x\) 和 \(e^x\),于是可以把多项式写成 \(\sum C_{i,j}x^ie^{jx}\) 的形式,即可做到 \(\mathcal O(m^3+n)\)。
AGC022
AGC022D Shopping
不难注意到,如果某一时刻买完东西了,则一定会在下一次列车到来时上车。
于是把铁轨拆成一个环,左右两边分别对应从两个方向到达一个商店进行购物,于是一次购物可以看成一条连接 \((x,x)\) 的边或者一条连接 \((x,x')\) 的边。
现在考虑如果已知到底是从左边购物还是从右边购物,那么最优策略是什么。
考虑有一个简单的做法:先走一个 \(0\to L\to 0\) 的环,然后中间把所有 \((x,x)\) 的都走了,然后对于一条边 \((x,x')\),走 \(0\to x\to x'\to 0\),对于一条边 \((x',x)\),走 \(n\to x'\to x\to n\),这样总代价为
然后考虑如果 \(x>y\) 且存在边 \((x,x'),(y',y)\),则可以构造路径 \(x\to x'\to y'\to y\to x\),这样就省去了 \(2L\) 的代价,于是把它看成二分图,相当于代价可以减去 \(2L\cdot |\rm {max\ matching}|\),这个问题在这种特殊性质的图上是可以 \(\mathcal O(n)\) 做的。
然后接下来考虑如果不知道方案怎么做,首先来考虑每个点的真实代价:
令 \(h=\min_v \{v\geq t|v=2kL\}\)。则:
- 如果是边 \((x,x)\),则代价就是 \(h\)。
- 如果是边 \((x,x')\),则代价为 \(w=\min_v \{v\geq t|v=2kL+2L-2x\}\),而我们实际计算的是 \(2x+w\),它是等于 \(h\) 的
- 如果是边 \((x',x)\),类似可以得到它也是等于 \(h\) 的
于是有一个惊人的结论:所有操作的基础代价是相同的!这直接导出能不走 \((x,x)\) 就不走。于是问题变成了如下的形式:数轴上有 \(n\) 个点,其中有黑点白点和未确定颜色的点,一个黑点可以匹配它前面的白点,你要染色使得最大匹配最大。
这个问题容易可撤销贪心解决,总复杂度 \(\mathcal O(n)\)。
最后还要额外注意:我们上面的讨论都基于「走一次 \(0\to L\to 0\)」,而如果最后一个点是 \((x,x')\) 且没有匹配的话,则这一步是不必要的,不需要额外计算从而让代价减去 \(2L\)。注意到这个点能带来最多一个匹配,所以一定是能选就选,然后转化为前 \(n-1\) 个点的子问题。
AGC022E Median Replace
考虑一下如果已知整个序列怎么判断答案,发现可以构造一个大小是常数的自动机然后把序列在自动机上跑。
具体地,只有如下几种状态是重要的:0 1 00 01 10 100
,原因是出现 11
的时候已经 win 了。
AGC022F Checkers
考虑 \(x\) 和 \(y\) 翻转后会变成 \(2y-x\),然后从 \(x\) 向 \(y\) 连一条边,然后最后会构成一棵外向树,然后发现一个点的不同系数和儿子个数以及父亲在它之后的儿子个数的和还有层数有关,然后逐层考虑发现只和上一层有奇数个儿子的节点个数有关,于是 \(dp_{i,j}\) 表示当前已经有 \(i\) 个点,上一层有 \(j\) 个节点有奇数个儿子,然后枚举这一层和父亲相同和不同的个数即可 \(\mathcal O(n^4)\),然后发现转移到的位置仅和 \(i+x\) 以及 \(j-x\) 有关,于是可以优化到 \(\mathcal O(n^3)\)。
AGC023
AGC023D Go Home
反向考虑这个问题,考虑最左边的人和最右边的人,如果最左边的人人数没有最右边的人多则会投票向右走,然后合并到最右边去继续考虑剩下的人即可。
AGC023E Inversions
考虑如果钦定了 \(p_i>p_j\) 该怎么做,设 \(a_i>a_j\),则所有方案分为两类:
- \(p_i>a_j\)
- \(p_i\leq a_j\)
注意到第一类全部能贡献,第二类恰有一半能贡献,然后推下柿子,线段树维护即可。
AGC023F 01 on Tree
考虑每次从儿子合并过来。
考虑一个 01 序列,发现有一些位置一定不会插入新的东西,于是维护若干个节点,每个节点表示若干个 \(0\) 和若干个 \(1\) 中间不会插入新的东西。记一个节点的权值为 \(cnt_1 / cnt_0\),则如果 \(x\) 在 \(y\) 前一个且 \(x>y\) 则可以合并在一起。
于是儿子就是直接归并排序,然后往后面扔一个新的东西并不断合并,启发式合并维护即可 \(\mathcal O(n\log^2 n)\),可以可并堆做到 \(\mathcal O(n\log n)\)。
AGC024
AGC024E Sequence Growing Hard
考察如果已知初始序列有多少种方式,发现相当于确定一个删除顺序使得每个数在他后面的极长的大于等于它的段之前删除。
考虑这个限制其实相当于要在后面的单调栈里的元素后面删除,于是构成一棵树,那么方案数就是 \(\frac{n!}{\prod siz_i}\)。
于是可以如下 dp:考虑 1 的第一个出现位置,则这一定是一棵树的根,且左右两边可以递归做,那么可以做到 \(\mathcal O(n^3)\)。
一个比较阴间的问题是模数不是质数找不到逆元,可以修改状态,让每个状态乘上 \(i!\),这样就把求逆变成了组合数。
AGC024F Simple Subsequence Problem
对每个串建子序列自动机,发现匹配状态可以如下描述:
已经确定了串 \(s\),还能匹配的是串 \(t\)
注意到这个总个数是 \(\mathcal O(n2^n)\) 的,于是在上面 dp 即可。
AGC025
AGC025D Choosing Points
考虑如果只有一个 \(D\) 怎么做:对 \(D\bmod 4\) 分类讨论
- 如果 \(D\bmod 4=0\),则不难注意到 \((2k+1,2k+1)\) 之类的点是全部独立的,于是可以拆成四个子问题分别做,这样可以让 \(D\gets \frac D4\)
- 如果 \(D\bmod 4=2\),则可以如下构造:取偶数行的所有元素,奇数行不取
- 如果 \(D\bmod 2=1\),则可以如下构造:取所有 \(x+y\bmod 2=0\) 的点。
于是只有一个 \(D\) 可以做到 \(\frac{n^2}{2}\),那么两个是不难类似分类讨论做到 \(\frac {n^2}{4}\) 的。
AGC025E Walking on a Tree
正解是欧拉回路。
我的做法是每次选一条被覆盖次数最少的边并选一条覆盖它的路径定向,现在不会证正确性,但是拍了 1000 组没有出锅,就假装它是对的吧。
AGC025F Addition and Andition
注意到 1 的个数是不增的,考虑一下什么改变能把代价均摊到 1 的个数上。
发现只有如下几种操作不能暴力做:
- 上一个位置的进位是 00
- 上一个位置的进位是 00 或 11,当前位置也是 00 或 11。
于是随便怎么维护一下这几种情况即可。
AGC026
AGC026D Histogram Coloring
考虑所有「有两个相邻相同颜色」的位置,发现这种东西相当于确定了一条带状物,一个方案合法当且仅当没有一个横着的和竖着的相交,对着这个随便写个 dp 即可。
AGC026E Synchronized Subsequence
做如下考虑:将每个极长不相交的区间拿出来分别做,然后不难证明答案就是单调栈里的所有元素。
然后考虑一段怎么做:
- 对于一个
a
开头的段,不难证明最后一定会变成abababab...
的形式,于是贪心即可。 - 对于一个
b
开头的段,考虑最长化最开头的一段b
的过程,则可以证明删除的是一段前缀,暴力枚举取最大值即可。
AGC026F Manju Game
首先先手可以得到 \(\max(w_{odd},w_{even})\)。
注意到长度为偶数的时候后手至少可以得到 \(\min(w_{odd},w_{even})\),于是答案是确定的。
而对于奇数的情况,不难证明先手第一步不会选一个奇数位置的数,否则就输麻了,于是每次一定是递归到两边两个长为奇数的区间,直到某一次不演了选全体奇数下标。
那么先手的答案显然是 \(w_{even}+w_0\),其中 \(w_0\) 是最后不演了的区间的奇数减偶数。那么二分答案,一个答案合法当且仅当能找到一个覆盖,满足每一段的和都 \(\geq X\),这个可以 \(\mathcal O(n)\) 做。
AGC027
AGC027D Modulo Matrix
想办法构造如下一个矩阵:我钦定所有 \(i+j\equiv0\pmod 2\) 处的值,然后剩下的取周围四个的 \(k\cdot\rm{lcm}+1\)。
然后考虑一下怎么构造:对每个 \(i+j\) 找一个素数 \(p\),然后找 \(p,2p,3p,\cdots\),这样答案是 \(\mathcal O(n^6)\),然后卡卡常即可通过。
AGC027E ABBreviate
特判答案等于 \(1\),剩下的把 \(a\) 看成 \(1\),\(b\) 看成 \(2\),相当于和 \(\bmod 3\) 不变,直接 dp 即可。
AGC027F Grafting
枚举第一步操作,然后把操作过的点设为根,剩下的问题拓扑排序即可解决。
AGC028
AGC028C Min Cost Cycle
先假装已经知道了我选的都是哪些权值该怎么判断是否合法,容易发现只需要对只有一边和两边都合法的点讨论即可。
然后容易发现我最后答案一定是权值和前 \(\mathcal O(1)\) 大的集合,暴力枚举判断即可。
AGC028D Chords
区间 dp 所有分界线的位置即可。
AGC028E High Elements
依次确定每个位置的答案。考虑原序列的全体前缀最大值,容易发现我一定存在一个方案,满足其中一个序列的所有前缀最大和都是原序列的前缀最大和,于是考虑另一个序列相当于要选出一个满足条件的子序列。
容易发现,如果存在长为 \(x\) 的子序列一定存在长为 \(x-2\) 的,于是对奇偶分别维护最大值即可。
AGC028F Reachable Cells
考虑一个简单容斥:用下面和右边的和减去两者都能到的全体元素。
注意到这是网格图,于是对每个位置求出每一行能到达的最左和最右 \(L,R\),则这两个位置在某一行能到的全体位置一定是某两个东西之间的全体可能到的元素。同时更好的性质是这些元素可以被分类为「某个格子能到的全体元素」,于是找出这个分类即可 \(\mathcal O(n^3)\),正解是神秘分治做到了 \(\mathcal O(n^2\log n)\)。
AGC029
AGC029C Lexicographic constraints
二分答案,随便 check 一下即可。
AGC029D Grid game
容易发现后手的最优策略就是每次往右走,于是先手的策略就是走到某一行然后摆烂,模拟即可。
AGC029E Wandering TKHS
考察每个元素对答案的贡献,容易分析出贡献是一个子树加,树上差分维护即可。
AGC029F Construction of a tree
考虑给每个点「选父亲」。具体地,合法的充分条件是以每个点为根,每个集合都能找到一个对应点,换句话说就是 \(k\) 个集合的邻域的并要 \(\geq k+1\)。
然后以 \(1\) 为根去构造一个匹配,即「选儿子」,之后用 BFS 去构造父亲,如果某一时刻做不了了则不满足条件,于是一定有解。
AGC030
AGC030C Coloring Torus
按照对角线构造即可。
AGC030D Inversion Sum
对每一对点算算贡献即可。
AGC030E Less than 3
考虑如果有 001100
是动不了的,于是只能是 101100
变成 100100
,然后变成 110100
,注意到这一过程可以看成是 1
的位置移动了,模拟这一过程即可。
AGC030F Permutation and Minimum
依次填全体没有确定位置的元素,直接做会在遇到一个已经填过的元素的时候不知道填没填过它的邻居,于是把这个贡献在填过的元素那里计算即可处理。