区间求mex的几种方法

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是满足要求的

posted @ 2017-01-09 09:11  _zwl  阅读(2300)  评论(1编辑  收藏  举报