【集训队作业】XRQRS

题目大意

现要求维护一个序列(初始为空),要求实现 m 个操作,包括以下几种。

  • 在序列末尾添加一个数 x
  • 删除数列末尾的 x 个数
  • 询问 [l,r) 区间中所有数与 x 异或,取得最大值的数
  • 查询 [l,r) 区间中的第 x 小数
  • 查询 [l,r) 区间中,小于等于 x 的数的个数

m5×105,5×105

分析

找区间第 k 小,小于等于某个数的个数,以及异或最值,可以分别用可持久化线段树以及可持久化 trie 简单地解决。

那么这道题就基本上解决了。

我们维护一个栈,表示当前的序列。

对于操作 1 ,添加一个数,则在当前序列末尾的数据结构基础上修改,将这个数压入栈中,并将新建的这个修改后的数据结构指向新加入的数。
对于操作 2 ,删除 x 个数,直接弹栈就可以了。
对于操作 3,4,5 就是经典的可持久化数据结构的应用了。这里就不赘述了。

时间复杂度 O(mlogn)
空间复杂度 O(mlogn)

你可能感兴趣的:(【集训队作业】XRQRS)