【集训队作业】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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值