区间第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[