题目大意
现要求维护一个序列(初始为空),要求实现 m 个操作,包括以下几种。
- 在序列末尾添加一个数
x - 删除数列末尾的 x 个数
- 询问
[l,r) 区间中所有数与 x 异或,取得最大值的数 - 查询
[l,r) 区间中的第 x 小数 - 查询
[l,r) 区间中,小于等于 x 的数的个数
m≤5×105,序列中的数≤5×105
分析
找区间第 k 小,小于等于某个数的个数,以及异或最值,可以分别用可持久化线段树以及可持久化
trie 简单地解决。那么这道题就基本上解决了。
我们维护一个栈,表示当前的序列。
对于操作 1 ,添加一个数,则在当前序列末尾的数据结构基础上修改,将这个数压入栈中,并将新建的这个修改后的数据结构指向新加入的数。
对于操作2 ,删除 x 个数,直接弹栈就可以了。
对于操作3,4,5 就是经典的可持久化数据结构的应用了。这里就不赘述了。时间复杂度 O(mlogn)
空间复杂度 O(mlogn)