AGC 002~005

发布时间 2023-12-25 21:53:35作者: Alan_Zhao_2007

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\)。这显然是有结合律的,于是快速幂即可。