莫队的简单应用
Description
有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。
Samples
Input #1
1 | 5 5 |
Output #1
1 | 1 |
Hint
对于30%的数据:1<=n,m<=1000
对于100%的数据:1<=n,m<=200000,0<=ai<=10^9,1<=l<=r<=n
Solution
看到没有强制在线, 第一眼就是莫队/cy
接下来就是考虑怎么写ADD
和DEL
了, 首先按照惯例记一个当前答案now
和每个数的出现次数.
在ADD
的时候, 如果这个数之前没有出现过, 那么应该和当前答案now
比较一下:
- 如果此数比
now
要大, 那么now
依然是最优答案, 不必更新 - 如果此数等于
now
(显然, 比now
小的数是不存在的), 那么应该向上找出一个满足条件的次小值然后更新答案.
DEL
就比较简单, 如果被DEL
掉的数出现次数变为0
, 那么应该和now
比较一下, 如果比now
小就需要更新了.
Code
1 | /* Headers */ |