ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

权值线段树模版

2021-04-10 21:03:49  阅读:141  来源: 互联网

标签:rt return lc int 模版 线段 mid num 权值


struct k_segment{
    int t[N],size;

    inline void update(int rt,int num,int l,int r,int v){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;

        if(l==r){t[rt]+=v;return;}
    
        if(num<=mid) update(lc,num,l,mid,v);
        else update(rc,num,mid+1,r,v);

        t[rt]=t[lc]+t[rc];
    }

    inline int queryK(int rt,int l,int r,int rk){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;

        if(l==r) return l;

        if(t[lc]>=rk) return queryK(lc,l,mid,rk);
        else return queryK(rc,mid+1,r,rk-t[lc]);
    }

    inline int query(int rt,int l,int r,int ql,int qr){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;

        if(ql<=l&&r<=qr) return t[rt];

        int ans=0;

        if(ql<=mid) ans+=query(lc,l,mid,ql,qr);
        if(qr>mid) ans+=query(rc,mid+1,r,ql,qr);

        return ans;
    }

    inline int rank(int x){
        if(x<=1) return 1;
        return query(1,1,size,1,x-1)+1;
    }

    inline int find_pre(int rt,int l,int r){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;
        
        if(l==r) return l;

        if(t[rc]) return find_pre(rc,mid+1,r);

        return find_pre(lc,l,mid);
    }

    inline int pre(int rt,int l,int r,int num){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;

        if(r<num){
            if(t[rt]) return find_pre(rt,l,r);
            return 0;
        }

        int ans=0;

        if(mid<num-1&&t[rc]&&(ans=pre(rc,mid+1,r,num))) return ans;

        return pre(lc,l,mid,num);
    }

    inline int find_next(int rt,int l,int r){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;

        if(l==r) return l;

        if(t[lc]) return find_next(lc,l,mid);
        
        return find_next(rc,mid+1,r);
    }

    inline int next(int rt,int l,int r,int num){
        int lc=rt<<1,rc=rt<<1|1,mid=(l+r)>>1;

        if(num<l){
            if(t[rt]) return find_next(rt,l,r);
            return 0;
        }

        int ans=0;

        if(num<mid&&t[lc]&&(ans=next(lc,l,mid,num))) return ans;

        return next(rc,mid+1,r,num);
    }
}a;

标签:rt,return,lc,int,模版,线段,mid,num,权值
来源: https://www.cnblogs.com/wsyunine/p/14642084.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有