【题解】P5072 [Ynoi2015] 盼君勿忘

题意

P5072 [Ynoi2015] 盼君勿忘

给定一个长度为 n 的序列 am 个询问 l,r,p,每次询问 [l,r] 中所有子序列去重后的和 modp

1n,m,ai105,1p109,1lrn

思路

莫队 + 光速幂。

操作不带修,考虑莫队。

考虑每个值对答案的贡献。

设当前区间为 [l,r],值 v[l,r] 内的出现次数为 cntv

很难直接求去重后包含值 k 的子序列个数,不妨稍加转化。如果将这些子序列中的 k 删除,则这些子序列中一定不出现 k。容易看出 [l,r] 内不包含 k 的子序列个数共有 2rl+1cntk 个。这意味着包含值 k 的子序列共有 2rl+12rl+1cntk 个。出现次数直接用普通莫队维护即可,复杂度是 O(nq)

对于出现次数相同的值,我们可以将它们的贡献一起统计。这里的实现可以维护一个针对出现次数的值域双向链表(?),每次从当前的出现次数开始向下一个存在的出现次数跳。双向链表的插入和删除可以 O(1) 做。显然询问的复杂度和值出现次数的个数有关,又易知对于不同的值出现次数,其个数是 O(n) 的。所以这一部分的复杂度是 O(qn)

普通的快速幂会被卡常。求 2 的整次幂可以用光速幂,这里不再赘述。这里光速幂单次预处理的复杂度是 O(n),查询 O(1)

总复杂度 O(nq+qn)

代码

posted @   kymru  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩