Tags : 总结 莫队 线段树
区间取mex的几种方法
题目大意
无修改,求区间 \(mex\)
做法1
莫队+二分+树状数组
树状数组维护维护桶,每次扫完二分答案,用树状数组判断
\(O(n\sqrt n \log n)\)
做法2
莫队+分块
分块维护桶,若块内满,则答案不在这一块,否则进去找
\(O(n\sqrt n)\)
做法3
权值线段树+离线
预处理nxt数组(a[nxt[i]]=a[i])
可以发现\(i+1\dots nxt[i]-1\)中不会出现\(a[i]\)
对于一个询问,我们就是要找不出现区间包含询问区间的值
把询问离线下来即可
注意把整个数组中都没有出现过的也要算上
还有一个数第一次出现前是可以贡献答案的
做法4
类似做法3的
我们不离线
询问相当于一个矩形
不出现区间看作二维的点
我们相当于询问矩形内最小值
树套树/kd-tree/cdq分治
cdq分治的方法:
对于询问的矩形按左端点x为关键字,对于二维点按x为关键字
分成两个区间,每次考虑用右边的点贡献左边的询问
将左半边的矩形右端点x和右半边的二维点x放在一起再排个序
用线段树维护y维即可
强制在线?
做法4中
树套树/kd-tree是满足要求的