mex 题解
题意简述
给定
前置知识
莫队
一种分块后离线处理询问的算法,此处就不多说了,还不会的请自己查询。
bitset
一种很神奇的数据结构,可参考扶苏的 bitset 浅谈 - 洛谷专栏。
分析
由于没有修改,所以我们可以想到用莫队,维护区间内数的个数,那么只需要考虑如何快速查找从小到大的第一个没有出现的数字就好。
此时我们发现 bitset 有一个非常神器的函数——_Find_first(),它可以直接返回 bitset 里第一个 bitset 中 bitset 里把这一位赋为 bitset 里把这一位赋为
但如果仅是上述做法不开 O2 是会 TLE 一个点,所以我们此处引入莫队的一种优化——奇偶性排序。
我们可以发现,每次变到下一个块时,
复杂度是
代码
莫队
for(int i=1;i<=q;i++){//莫队
while(st[i].l<L){
L--;
add(a[L],1);
}
while(st[i].l>L){
add(a[L],-1);
L++;
}
while(st[i].r<R){
add(a[R],-1);
R--;
}
while(st[i].r>R){
R++;
add(a[R],1);
}
anss[st[i].id]=bit._Find_first();
}
添加或删点
void add(int l,int x){
if(x==1){
if(cnt[l]==0) bit.set(l,0);//以前l没出现过
cnt[l]++;
}
else {
cnt[l]--;
if(cnt[l]==0) bit.set(l,1);//当前区间内没有l了
}
}
AC代码
这里。