P8332 [ZJOI2022] 面条 解题报告:
更好的阅读体验
题意
定义序列 a 上的一次操作为:
∀1⩽i⩽nbi←ai+an−i+1∀1⩽i⩽nai←b⌈i2⌉2
给定序列 a 以及一个位置 x,q 次询问,每次求 a 应用 ki 次操作后,ax 的值是多少。
分析
巨大厉害题,搬运一下官方题解!
可能写的有点口胡,补完代码之后来补充一下。
将最后答案除以 2k,那么我们第二个操作就不需要要除二了。
我们手玩一下操作过程:
abcdefgh⋯z→aabbccdd⋯zz→⋯(a×2w)(b×2w)⋯(z×2w)→(a×2t+1)(b×2t+1)⋯(z×2t)
(其中一个字母在不同阶段不代表相同数字)
也就是说,令 t 为 n 最低非零位,那么我们应用 t+1 次操作后,会变成很多个长度为 2t+1 的相同段,最后接一个长度为 2t 的相同段。
显然这个过程的操作与询问都可以在 O(nlogn) 内暴力模拟。
将长度为 2t 的相同段缩成一个字母,令新的序列为 c1,c2⋯,cm。考察接下来的操作造成的影响:
c1,c2,⋯,cm→c1+cm,c1+cm−1,c2+cm−1,c2+cm−2,⋯
令差分数组为 d,那么操作就为:
d1,d2,⋯,dm−1→−dm−1,d1,−dm−2,⋯
那么,一次操作就是 d1,d2,⋯dm−1,−d1,−d2,⋯,−dm−1 的一次置换,令这个置换为 g,我们询问的答案就是:
C+m−1∑i=1[gk(i)<x]di=C+x−1∑i=1dg−k(i)
C 可以简单计算出,后面这个式子考虑拆出所有置换环,每个置换环(设大小为 c)通过一次卷积求出所有 k∈[0,c) 的答案。
将大小相同的置换环的答案加到一起,每次询问只需要枚举 O(√n) 个置换环将答案加起来即可,复杂度 O(nlogn+q√n),不能通过。
继续挖掘这个置换 g 的性质(g−1 与 g 性质相同),手玩可以发现所有置换环大小都是 2 在 2(m−1) 下的阶 r 的因数。
也就是答案关于 r 是循环的,那么我们将大小相同的置换环加和之后,直接维护 k∈[0,r) 的答案就好了。
复杂度 O(nd(n)+q),可以通过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类