Problem Set #1

我也不知道为什么要用这种方式,但是好像学长都在用。

1. [AGC001D] Arrays and Palindrome

序列全相同需要具有 \(n-1\) 个本质不同等量关系,而 \([l,r]\) 回文可以带来 \(\lfloor\frac{r-l+1}{2}\rfloor\) 个不同等量关系。由此可以发现,序列 \(a\)\(b\) 中总共至多有 \(2\) 个奇数,构造解简单错开即可。

2. [AGC001E] BBQ Hard

非常优雅。

注意到组合数 \({a+b}\choose a\) 的一个意义是,在网格图上只向右和向上,从 \((0,0)\) 走到 \((a,b)\) 的方案数。

显然这个是可以 \(O(n^2)\) dp 出来的。但是统计答案时还是要枚举 \(i\)\(j\),这就很若智。那怎么办?

突然发现,从 \((0,0)\) 走到 \((a_1+a_2,b_1+b_2)\) 等同于 从 \((-a_1,-b_1)\) 走到 \((a_2,b_2)\)。答案应该是所有“正点” 从所有“负点”起始的方案数之和 的和。因此我们可以设置将这些位置设为起始点 即令 \(f_{-a_i,-b_i}\)\(1\),再去做转移。统计答案需去掉 \((-a_i,-b_i)\)\((a_i,b_i)\) 产生的贡献。

3. [AGC001F] Wide Swap

天才题,看了题解才做出来,这东西原来可以直接归并排序。

首先作逆排列 \(a\) 交换条件,有 \(O(n^2)\) 的暴力,即直接冒泡排序,尽量让大数向右侧移动。

这时很多人找不到突破口,就开始狠狠建图分讨拓扑。但是实际上,这个冒泡排序的过程可以用归并排序优化。考虑合并左右两区间 \([l,m]\)\([m+1,r]\),当前指针分别为 \(i\)\(j\)。若 \(j\) 要直接放在现在这个位置上,那么必须满足 \(a_j+k\leq\min\limits_{k\in[i,m]} a_k\),这样才能成功交换到前面去,还能保证这样填一定更优。

4. [AGC002D] Stamp Rally

不想写整体二分。

每次询问二分答案,显然走的边在最小生成树上。要求一定限制下的边集大小,那就使用 Kruskal 重构树,简单跳祖先找,记子树大小校验即可。

有微量实现细节。

5. [AGC002E] Candy Piles

每次删掉最多的一堆,考虑降序排列,摆在网格中,操作转化为每次删除最下的一行或者最左的一列。注意这个网格有糖果的左下角的格子。发现题目可以转化为划定一条终点线,Snuke Ciel 轮流移动左下角格子,每次可以向上或向右移动一格,问谁会碰到终点线。

本来可以直接设 \(f_{i, j}\) 表示左下角为 \((i,j)\) 是必胜还是必败,但是 \(n\leq 10^5\),需要再挖掘一些性质。

比如注意到 \(f_{i+1,j+1} = f_{i,j}\)。证明是简单的。

6. [AGC002F] Leftmost Ball

诈骗题(想容斥就万劫不复)

观察结果序列,满足有 \(n\) 个白球,\(n\) 种颜色的球各 \(k-1\) 个,且每个前缀的白球个数不少于颜色种类数。

考虑 dp。将唯一的特殊限制设入状态内,\(f_{i,j}\) 表示已经放了 \(i\) 个白球,放置了 \(j\) 种颜色的球。

考虑转移。首先白球可以直接放到当前的第一个空位。即 \(f_{i-1,j}\) 可转移到 \(f_{i, j}\)

考虑 \(f_{i,j-1}\) 的状态下加入一个新颜色种类的球。当前已使用了 \(i + (j-1) \times (k-1)\) 个位置。首先第一个新颜色球一定要放在第一个空位,剩下 \(k-2\) 个球可以放在后面任何空位中。然后组合数转移即可。

转移都将新东西放到当前第一个空位可避免发生重复。

7. [AGC003D] Anticube

简单题。

考虑分解质因数,立方因数都可以忽略,即次数对 \(3\) 取模。将次数分别为 1/2 的质因数乘起来,形成一个数对 \((x,y)\)。显然,如果要和它相乘得到完全立方数,则需要数对 \((y,x)\)。可以记录一下每个数对的出现次数,对于这种情况取 max 选择即可。

\(x=y(=1)\),即本身就是完全立方数的情况需要另外考虑。

实际上是可以筛出 \(\sqrt{V}\) 内所有质数然后再做质因数分解,复杂度是四次根号的。虽然三次根号完全够用,没必要写质数筛,太麻烦了。

8. [AGC003E] Sequential operations on Sequence

神奇题。

显然可以假定 \(q_i<q_{i+1}\)。观察每次改变的部分,\(q_i\) 是由 \(q_{i-1}\) 的若干复制再带一个前缀而拼成。复制部分是好考虑的,而这个前缀 \(x\) 也可以类似上述转移,找到不超过该前缀长度的 \(q_l\),由于 \(q_{l+1}\) 是由 \(q_l\) 若干复制带前缀拼成,\(q_l\leq x<q_{l+1}\),因此前缀 \(x\) 也是 \(q_l\) 的若干复制带前缀。可以一直递归下去,直到 \(x<q_1\),即这个前缀甚至没越过初始序列,此时就可以简单做一个前缀加,差分算就可以做到 \(O(n\log^2n)\) 的复杂度。

9. [AGC003F] Fraction of Fractal

神秘思维题。

如果 Snuke 网格上下左右皆可拼接,答案为 \(1\);若皆不可拼接,设黑格数量为 \(a\),则答案为 \(a^{k-1}\),注意当 \(k=0\) 时,答案为 \(1\)

规定带下标 $ _0$ 表示在 Snuke 网格中,带上标 \('\) 表示操作后,不带任何代表操作前。

讨论上下左右只有一方向可拼接。不妨令这个方向为左右。考虑把答案表示成更好算的东西:黑点个数 \(a\) -左右相邻黑点对数 \(b\)。 显然 \(a' = a_0a\),考虑怎么算 \(b'\)。观察每次操作这个数的转移,发现 \(b' = b_0a + b\times\)Snuke网格上拼接部分相邻黑点对数 \(c_0\)

但是操作次数太大了,直接暴力转移复杂度不可接受,于是考虑类似快速幂的东西。将原转移的 Snuke网格 改为 任意网格(下标 $ _1$)。关注 \(c\)\(c'\) 的过程,发现是原本一对黑点,变成了 \(c_1\) 对。因此 \(c'=c_1c\)。注意到这个转移满足结合律,因此可以快速幂。

10. [AGC004E] Salvage Robots

抽象题。

首先,固定棋盘和终点移动机器人是困难的,因此考虑固定机器人移动棋盘和终点。先玩玩一维。

比如向右侧移动一格,观察你所获得的收益:浪费了原左端点处格子,但救下了原终点右一格的机器人。反向同理。

而二维也是类似的。棋盘向右移动一格,观察所获得的收益:注意到终点可以走过的点一定能够形成一个矩形,因此矩形也向右扩展一格;最棋盘的最左边界被浪费了。其他三个方向同理。因此可以设出 dp 状态 \(f_{l, r, u, d}\),表示相较于最初的棋盘位置,向左走了 \(l\) 格,向右 \(r\) 格...依此类推。这是好转移的。

11. [AGC005E] Sugigma: The Showdown

神秘虚高题。考虑判 -1,当且仅当红树中存在一条边 \((x,y)\),使在蓝树中 \(x\)\(y\) 的最短路径距离至少为 \(3\),因为中间留了两个点给蓝数走,只要往一边靠红树就跑另一边。不难发现这是唯一情况。然后非 -1 暴力搜索做就好了。

不知道为什么评 3276 这么高的分。

12. [AGC005F] Many Easy Problems

入门多项式题。

首先暴力没有任何优化前途,考虑对于每个点计算其贡献。对于点 \(i\),计算最小连通块包含 \(i\) 的点集个数。容斥一下,答案为 \({n\choose k}-{n-sz_i \choose k}-\sum\limits_{v\in son_i}{sz_v\choose k}\)
第三部分是对于除根以外所有子树各出现一次。因此总答案为 \(n{n\choose k}-\sum\limits_{i=2}^{n}({sz_i\choose k}+{n-sz_i\choose k})\)
考虑对 \(sz_i\)\(n-sz_i\) 计数,答案为 \(n{n\choose k}-\sum\limits_{i=k}^n cnt_i{i\choose k}\)
将组合数拆开,\(n{n\choose k}-\sum\limits_{i=k}^n cnt_i\frac{i!}{k!(i-k)!}=n{n\choose k}-\frac{1}{k!}\sum\limits_{i=k}^n cnt_ii!\frac{1}{(i-k)!}\),这是个卷积的形式。

atcoder 同时为我们提供了 static_modint 和 convolution,代码量为 \(0\)。不知道为什么评 3440 这么高的分。

posted @ 2024-09-02 09:33  Lightwhite  阅读(22)  评论(0)    收藏  举报