Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

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

题意

P5072 [Ynoi2015] 盼君勿忘

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

1 \leq n, m, a_i \leq 10^5, 1 \leq p \leq 10^9, 1 \leq l \leq r \leq n

思路

莫队 + 光速幂。

操作不带修,考虑莫队。

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

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

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

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

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

总复杂度 \mathcal{O}(n \sqrt{q} + q \sqrt{n})

代码

posted @   kymru  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?
· windows下测试TCP/UDP端口连通性
点击右上角即可分享
微信分享提示
主题色彩