• P8332 [ZJOI2022] 面条 解题报告


    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)} \]

    \(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)\),可以通过。

  • 相关阅读:
    八数码问题--bfs
    子集生成——增量构造法
    回溯法
    子集生成——二进制法
    子集生成
    dfs 记忆搜索——注意剪枝方式
    pyhon---信息的爬取与提取---bs4,BeautifulSoup,re库
    008sudo用户管理
    007Linux在线升级yum
    006NFS与TFTP服务器
  • 原文地址:https://www.cnblogs.com/xiaoziyao/p/16229785.html
Copyright © 2020-2023  润新知