线段树二分
在线段树上二分。
假设是找排名 lim 的位置:
int qur(int lim,int l,int r,int k){
if(l==r){
return l;
}
else{
int m=(l+r)>>1;
down(l,r,k);
int suml=(m-l+1)-t[k<<1].sum;
if(lim>suml)return qur(lim-suml,m+1,r,k<<1|1);
else return qur(lim,l,m,k<<1);
}
}
可能是在有左右限制范围内的寻找。假设是找最靠左的 \(\le w\) 的位置:
int qur(int L,int R,int w,int l,int r,int k){
if(l>R||r<L||t[k]>w)return 0;
if(l==r){
return l;
}
else{
int m=(l+r)>>1;
down(k);
int res=qur(L,R,w,l,m,k<<1);
if(!res)res=qur(L,R,w,m+1,r,k<<1|1);
return res;
}
}
线段树存的是区间最小值。先向左找,如果没有向右找。如果超出区间就不找。可以分析下时间复杂度是对的。

浙公网安备 33010602011771号