线段树二分

在线段树上二分。

假设是找排名 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;
    }
}

线段树存的是区间最小值。先向左找,如果没有向右找。如果超出区间就不找。可以分析下时间复杂度是对的。

posted @ 2026-08-03 10:29  TanHaoren  阅读(3)  评论(0)    收藏  举报