AGC 002~005
AGC002
E - Candy Piles
考虑题目给的两种操作,假如把 \(a_1,a_2,\dots,a_N\) 列成杨表的形式:将 \(a_i\) 从大到小排序,第一列有 \(a_1\) 个点,第二列有 \(a_2\) 个点,……,且每一列最底下是对齐的,那么这个游戏相当于每次消去最底下一行或者最左边一列,第一个把整个杨表消完的人输。
再转化一下可以变成,有一个点初始在 \((0,0)\),每次可以将它向上或向右移动一格,最先将它移动到杨表的边界处的人输。(Editorial 里有图。)
发现只要 \((x+1,y+1)\) 不在杨表边界上,\((x,y)\) 的输赢就一定和 \((x+1,y+1)\) 相同。于是我们可以把 \((0,0)\) 移动到最靠近杨表边界的那个位置,此时只有往上走若干步和往右走若干步两种选择,只需要检查这两种里是否有一种到边界的距离是偶数即可。
时间复杂度 \(O(N)\)。
F - Leftmost Ball
挺简单的。
一个序列是合法的,当且仅当:
- 有恰好 \(N\) 个 \(0\) 和 \((K-1)\) 个 \(1,2,\dots,N\);
- 每个前缀的 \(0\) 的个数大于等于 \(1,2,\dots,N\) 中出现过的数的个数。
这样我们只需要考虑 \(1,2,\dots,N\) 中每个数第一次出现的位置。由于这些数没有区别,我们可以假设它们是按顺序出现的,最后将答案乘上 \(N!\) 即可。
设 \(f_{i,j}\) 表示长为 \(i\) 的序列,填了 \(1,2,\dots,j\) 以及 \((i-j)\) 个 \(0\) 的方案数。下一个填 \(0\) 的转移是简单的;如果下一个填 \(j+1\),那么这两个数组可以任意穿插起来:
- \((K-2)\) 个 \(j+1\);
- \(j+2,j+3,\dots,N\) 各 \((K-1)\) 个,以及 \((N-i+j)\) 个 \(0\) 组成的序列。我们并不需要知道这个序列具体长成什么样,因为它的形态是在后面的 DP 过程中决定的。
于是穿插的方案数可以直接用组合数算。时间复杂度 \(O(N^2)\)。
AGC003
E - Sequential operations on Sequence
好像是和题解不太一样的做法。
把题面中的 \(q\) 叫做 \(a\),并令 \(a_0=N\)。首先我们只需要保留 \(a\) 中的所有后缀最小值。倒着做,考虑最后那个长为 \(a_Q\) 的序列,它当中的每个元素对答案的贡献系数都是 \(1\)。而把它缩成一个长为 \(a_{Q-1}\) 的序列,就相当于把 \(a_Q\) 中每个位置的贡献系数加到 \(a_{Q-1}\) 中的对应位置上。
设进行了 \(i,i+1,\dots,Q\) 这些操作后的贡献数组是 \(b_{i,1},b_{i,2},\dots,b_{i,a_i}\)。我们用 map 维护 \(b_i\) 的从 \(2\) 开始的差分数组中的所有非零项,以及 \(b_{i,1}\) 和 \(b_{i,a_i}\) 的值。发现进行 \(a_{i-1}\) 相当于:
- 对于差分数组中每一个下标 \(>a_{i-1}\) 的项 \((j,x)\),把它加到 \((j-1)\bmod a_{i-1}+1\) 位置上,并且计算它对 \(b_{i-1,1}\) 的贡献;
- 在 map 中插入 \(((a_{i}-1)\bmod a_{i-1}+2,b_{i,a_i})\) 这一项,这是 \(b_{i-1}\) 中靠后的一段比靠前的一段少加的那部分。
由于每次一个二元组被删除后,它的下标都会至少除以 \(2\),所以总的时间复杂度是 \(O(Q(\log Q+\log V))\)。
F - Fraction of Fractal
一个很重要的条件是,开始时的网格是四连通的。如果给定的网格左右拼接和上下拼接时,两个连通块都能合并,那么最后的图形中一定只有一个连通块。如果都不能合并,那么最后的图形中就有 \(b^{K-1}\) 个连通块,其中 \(b\) 是黑格个数。
否则不妨假设左右能够合并,那么答案就是最后的黑格个数减去左右相邻两个都是黑格的位置数。设 \(b_{i},c_{i},d_{i}\) 表示 \(i\) 级分形中的黑格个数,左右相邻两个都是黑格的位置数,左右拼起来都是黑格的位置数,那么 \(b_{i+1}=b_1b_i,c_{i+1}=b_1c_i+c_1d_i,d_{i+1}=d_1d_i\)。这显然是有结合律的,于是快速幂即可。