题解 P8332【[ZJOI2022] 面条】
whiteqwq
·
·
题解
P8332 [ZJOI2022] 面条 解题报告:
更好的阅读体验
题意
定义序列 a 上的一次操作为:
\forall_{1\leqslant i\leqslant n} b_i\leftarrow a_i+a_{n-i+1}
\forall_{1\leqslant i\leqslant n}a_i\leftarrow \frac{b_{\lceil\frac{i}{2}\rceil}}{2}
给定序列 a 以及一个位置 x,q 次询问,每次求 a 应用 k_i 次操作后,a_x 的值是多少。
分析
巨大厉害题,搬运一下官方题解!
可能写的有点口胡,补完代码之后来补充一下。
将最后答案除以 2^k,那么我们第二个操作就不需要要除二了。
我们手玩一下操作过程:
abcdefgh\cdots z\rightarrow aabbccdd\cdots zz\rightarrow\cdots (a\times 2^w)(b\times 2^w)\cdots(z\times 2^w)\rightarrow (a\times 2^{t+1})(b\times 2^{t+1})\cdots(z\times 2^t)
(其中一个字母在不同阶段不代表相同数字)
也就是说,令 t 为 n 最低非零位,那么我们应用 t+1 次操作后,会变成很多个长度为 2^{t+1} 的相同段,最后接一个长度为 2^t 的相同段。
显然这个过程的操作与询问都可以在 O(n\log n) 内暴力模拟。
将长度为 2^t 的相同段缩成一个字母,令新的序列为 c_1,c_2\cdots,c_m。考察接下来的操作造成的影响:
c_1,c_2,\cdots,c_m\rightarrow c_1+c_m,c_1+c_{m-1},c_2+c_{m-1},c_2+c_{m-2},\cdots
令差分数组为 d,那么操作就为:
d_1,d_2,\cdots,d_{m-1}\rightarrow -d_{m-1},d_1,-d_{m-2},\cdots
那么,一次操作就是 d_1,d_2,\cdots d_{m-1},-d_1,-d_2,\cdots,-d_{m-1} 的一次置换,令这个置换为 g,我们询问的答案就是:
C+\sum_{i=1}^{m-1}[g^k(i)<x]d_i=C+\sum_{i=1}^{x-1}d_{g^{-k}(i)}
将大小相同的置换环的答案加到一起,每次询问只需要枚举 $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)$,可以通过。