P8332 [ZJOI2022] 面条 解题报告:
题意
定义序列 \(a\) 上的一次操作为:
给定序列 \(a\) 以及一个位置 \(x\),\(q\) 次询问,每次求 \(a\) 应用 \(k_i\) 次操作后,\(a_x\) 的值是多少。
分析
巨大厉害题,搬运一下官方题解!
可能写的有点口胡,补完代码之后来补充一下。
将最后答案除以 \(2^k\),那么我们第二个操作就不需要要除二了。
我们手玩一下操作过程:
(其中一个字母在不同阶段不代表相同数字)
也就是说,令 \(t\) 为 \(n\) 最低非零位,那么我们应用 \(t+1\) 次操作后,会变成很多个长度为 \(2^{t+1}\) 的相同段,最后接一个长度为 \(2^t\) 的相同段。
显然这个过程的操作与询问都可以在 \(O(n\log n)\) 内暴力模拟。
将长度为 \(2^t\) 的相同段缩成一个字母,令新的序列为 \(c_1,c_2\cdots,c_m\)。考察接下来的操作造成的影响:
令差分数组为 \(d\),那么操作就为:
那么,一次操作就是 \(d_1,d_2,\cdots d_{m-1},-d_1,-d_2,\cdots,-d_{m-1}\) 的一次置换,令这个置换为 \(g\),我们询问的答案就是:
\(C\) 可以简单计算出,后面这个式子考虑拆出所有置换环,每个置换环(设大小为 \(c\))通过一次卷积求出所有 \(k\in[0,c)\) 的答案。
将大小相同的置换环的答案加到一起,每次询问只需要枚举 \(O(\sqrt n)\) 个置换环将答案加起来即可,复杂度 \(O(n\log n+q\sqrt n)\),不能通过。
继续挖掘这个置换 \(g\) 的性质(\(g^{-1}\) 与 \(g\) 性质相同),手玩可以发现所有置换环大小都是 \(2\) 在 \(2(m-1)\) 下的阶 \(r\) 的因数。
也就是答案关于 \(r\) 是循环的,那么我们将大小相同的置换环加和之后,直接维护 \(k\in[0,r)\) 的答案就好了。
复杂度 \(O(nd(n)+q)\),可以通过。