AGC 002~005

AGC002

E - Candy Piles

考虑题目给的两种操作,假如把 a1,a2,,aN 列成杨表的形式:将 ai 从大到小排序,第一列有 a1 个点,第二列有 a2 个点,……,且每一列最底下是对齐的,那么这个游戏相当于每次消去最底下一行或者最左边一列,第一个把整个杨表消完的人输。

再转化一下可以变成,有一个点初始在 (0,0),每次可以将它向上或向右移动一格,最先将它移动到杨表的边界处的人输。(Editorial 里有图。)

发现只要 (x+1,y+1) 不在杨表边界上,(x,y) 的输赢就一定和 (x+1,y+1) 相同。于是我们可以把 (0,0) 移动到最靠近杨表边界的那个位置,此时只有往上走若干步和往右走若干步两种选择,只需要检查这两种里是否有一种到边界的距离是偶数即可。

时间复杂度 O(N)

F - Leftmost Ball

挺简单的。

一个序列是合法的,当且仅当:

  • 有恰好 N0(K1)1,2,,N
  • 每个前缀的 0 的个数大于等于 1,2,,N 中出现过的数的个数。

这样我们只需要考虑 1,2,,N 中每个数第一次出现的位置。由于这些数没有区别,我们可以假设它们是按顺序出现的,最后将答案乘上 N! 即可。

fi,j 表示长为 i 的序列,填了 1,2,,j 以及 (ij)0 的方案数。下一个填 0 的转移是简单的;如果下一个填 j+1,那么这两个数组可以任意穿插起来:

  • (K2)j+1
  • j+2,j+3,,N(K1) 个,以及 (Ni+j)0 组成的序列。我们并不需要知道这个序列具体长成什么样,因为它的形态是在后面的 DP 过程中决定的。

于是穿插的方案数可以直接用组合数算。时间复杂度 O(N2)

AGC003

E - Sequential operations on Sequence

好像是和题解不太一样的做法。

把题面中的 q 叫做 a,并令 a0=N。首先我们只需要保留 a 中的所有后缀最小值。倒着做,考虑最后那个长为 aQ 的序列,它当中的每个元素对答案的贡献系数都是 1。而把它缩成一个长为 aQ1 的序列,就相当于把 aQ 中每个位置的贡献系数加到 aQ1 中的对应位置上。

设进行了 i,i+1,,Q 这些操作后的贡献数组是 bi,1,bi,2,,bi,ai。我们用 map 维护 bi 的从 2 开始的差分数组中的所有非零项,以及 bi,1bi,ai 的值。发现进行 ai1 相当于:

  • 对于差分数组中每一个下标 >ai1 的项 (j,x),把它加到 (j1)modai1+1 位置上,并且计算它对 bi1,1 的贡献;
  • 在 map 中插入 ((ai1)modai1+2,bi,ai) 这一项,这是 bi1 中靠后的一段比靠前的一段少加的那部分。

由于每次一个二元组被删除后,它的下标都会至少除以 2,所以总的时间复杂度是 O(Q(logQ+logV))

F - Fraction of Fractal

一个很重要的条件是,开始时的网格是四连通的。如果给定的网格左右拼接和上下拼接时,两个连通块都能合并,那么最后的图形中一定只有一个连通块。如果都不能合并,那么最后的图形中就有 bK1 个连通块,其中 b 是黑格个数。

否则不妨假设左右能够合并,那么答案就是最后的黑格个数减去左右相邻两个都是黑格的位置数。设 bi,ci,di 表示 i 级分形中的黑格个数,左右相邻两个都是黑格的位置数,左右拼起来都是黑格的位置数,那么 bi+1=b1bi,ci+1=b1ci+c1di,di+1=d1di。这显然是有结合律的,于是快速幂即可。

作者:alan-zhao-2007

出处:https://www.cnblogs.com/alan-zhao-2007/p/17927058.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Alan_Zhao_2007  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2021-12-25 P3312 [SDOI2014] 数表- 数论
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题