1 条题解
-
0
Guest
MOD
- 1
信息
- ID
- 2670
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 3
- 已通过
- 1
- 上传者
对于每一个 k,假设能 O(1) 找出对于一个 l,最大的 r 使得 [l,r] 内区间数字的种类数 ≤k,就能 O(nlogn) 解决,因为对于每一个 k 最多会找 kn 次。
那么现在问题变成快速对于一个 l,求一个最大的 r 使得 [l,r] 内区间数字的种类数 ≤k,而且要求在线,但对于每个 k,l 的询问是递增的。
枚举 l,对于 [l,n] 中的每个位置记录它是否是 [l,n] 中第一次出现,区间数字的种类数即为区间和。
现在问题变成了支持单点修改,快速求一个最大的 r 使得 [1,r] 的和 ≤k,用树状数组维护前缀和,由于树状数组下标为 x 处存的值为 (x−lowbit(x),x] 区间的和,那么从高到低枚举所求 r 的二进制位 k,看是否能够往后跳 2k ,就能求出这个最大的 r 了。
总的时间复杂度是 O(nlog2n)。