c++求区间第k大数_区间第k大的几种解法

区间第K大问题,变化包括带修改和不带修改,强制在线和允许离线

修改主要是单点修改,我们前面也只讨论这种情况。

接下来我们从编程复杂度和时空复杂度来讨论几种做法。

1.整体二分(编程复杂度:低-中,时间复杂度:优秀,空间复杂度:优秀)

缺点:只能做离线

优点:空间都是O(n)。常数小。带修改O(nlog2n),不带修改O(nlogn)。

但是不带修改的情况,如果允许的话,个人认为加个树状数组写O(nlog2n)的更好写

这时单次solve中面对的问题是,数列中一些点是1其余都是0,然后求区间和的问题

这个问题把区间和变成前缀和相减,然后用vector来对那些需要求前缀的点做桶排

然后双指针即可做到单次solve为O(k),k为此次处理的操作数,总体O(nlogn)的复杂度

显然如果不差那log的时间,直接用树状数组来处理更好写

下面给了一个带单点修改查询区间第K小的整体二分代码

1 #include

2

3 #define lb(x) (x&(-x))

4

5 using namespacestd;6

7 const int N = 2e5 + 5;8

9 intt, n, m, k, cnt;10

11 structnode {12 intid, i, j, k;13 }a[N], q1[N], q2[N];14

15 intans[N], b[

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值