K大数查询

标记永久化:1:26:00

如果外层线段树为下标线段树会发现没有办法快速维护,这个时候我们就要想到权值线段树:外层采用权值线段树,其每个节点维护一颗下标线段树,表示这个节点所代表的权值在序列中有多少个。如果 n = 5 n=5 n=5,值域大小为 5 5 5,那么权值线段树如下

image

比如 [ 4 , 5 ] [4,5] [4,5]这个节点,维护了一颗线段树,如下

image

对于这棵线段树中的 [ 1 , 3 ] [1,3] [1,3]这个节点,表示的是 4 4 4 5 5 5在序列下标为 [ 1 , 3 ] [1,3] [1,3]中出现的总次数

于是修改就可以变成 O ( log ⁡ 2 n ) O(\log^2n) O(log2n)

对于查询,很容易想到用二分,但是时间复杂度为 O ( log ⁡ 3 n ) O(\log^3n) O(log3n);线段树加二分我们一定要想到线段树二分,这样时间复杂度就会变成 O ( log ⁡ 2 n ) O(\log^2n) O(log2n)

对于内层线段树,肯定要使用动态开点;对于区间修改可以使用懒标记和标记永久化,这里如果使用懒标记的话,下传的时候如果儿子没有开点是要先开一个点的,这样可能会导致多开很多个点,于是MLE,所以用标记永久化更能过

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值