HH 的项链

HH的项链 题解

题意

给定一个序列 aN ,有 m 个询问 [l,r] ,问在该区间中不同数的数量有多少。该题目可以和 ABC371E 对比着做。

思路

N[1,106] ,暴力枚举是 n2 的会超时。

但是我们先假定这 n 个数字本就两两不同,那么他们各自都会产生 1 的贡献,如果每个数相应的位置都代表数值 1 ,那么就是在查询 sum[r]sum[l1] 而已。

事实上上述假设并不能一定成立。

那么有一种和莫队和相似的巧妙算法就是先离线,然后再考虑区间之间移动时的增量。

核心

我们先按照右区间升序排序。

言下之意就是如果有 1145143 ,那你也只能算一种。我们保留刚刚的前缀和算法,钦定所有相同数字 x 所产生的贡献 1 都在当前最右边的 x 身上,其余的 x 贡献都为 0,并且随着我们枚举区间不断更新这个"最右"的位置,这时候我们发现了按照右区间升序排序的优越性。

那就是下一个枚举到的区间要不就不包含 x 这个数字 ,要么就一定至少包含最右边的 x (可能同时包含左边的 x ),由于 r 是逐渐增大的,所以我们不可能枚举到一个包含左边 x 们,但又不包含最右边 x 的区间。因此我们就成功统计了 x 对当前区间 (如果有的话)的贡献。

所以对于一个 [l,r] ,我们先做好从上一个 rlas 到这一个 rnow 的更新,再直接统计答案 sum[r]sum[l1] 就好了。

由于是单点修改并且多次查询,就选择树状数组了。

Code

posted @   Hanggoash  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示