zoukankan      html  css  js  c++  java
  • 权值线段树模版

    struct seg_T{
        int t[N],sz;
    
        inline void pushup(int x){
            t[x]=t[x<<1]+t[x<<1|1];
        }
    
        void change(int x,int l,int r,int val,int s){//加数修改都用ta
            int mid=(l+r)>>1;
            if(l==r){t[x]+=s,sz+=s;return;}
            if(val<=mid) change(x<<1,l,mid,val,s);
            else change(x<<1|1,mid+1,r,val,s);
            pushup(x);
        }
    
        int queryK(int x,int l,int r,int rk){//查第K大
            int mid=(l+r)>>1;
            if(l==r) return l;
            if(t[x<<1]>=rk) return queryK(x<<1,l,mid,rk);
            else return queryK(x<<1|1,mid+1,r,rk-t[x<<1]);
        }
    
        int query(int x,int l,int r,int ql,int qr){//区间数次
            int mid=(l+r)>>1,ans=0;
            if(ql<=l&&qr>=r) return t[x];
            if(ql<=mid) ans+=query(x<<1,l,mid,ql,qr);
            if(qr>mid) ans+=query(x<<1|1,mid+1,r,ql,qr);
            return ans;
        }
    
        inline int rank(int x){//查排名
            if(x<=1) return 1;
            return query(1,1,sz,1,x-1)+1;
        }
    
        int find_pre(int x,int l,int r){
            int mid=(l+r)>>1;
            if(l==r) return l;
            if(t[x<<1|1]) return find_pre(x<<1|1,mid+1,r);
            else return find_pre(x<<1,l,mid);
        }
    
        inline int pre(int x,int l,int r,int val){//查前驱
            int mid=(l+r)>>1,ans=0;
            if(r<val){
                if(t[x]) return find_pre(x,l,r);
                return 0;
            }
            if(mid<val-1&&t[x<<1|1]&&(ans=pre(x<<1|1,mid+1,r,val))) return ans;
            else return pre(x<<1,l,mid,val);
        }
    
        int find_next(int x,int l,int r){
            int mid=(l+r)>>1;
            if(l==r) return l;
            if(t[x<<1]) return find_next(x<<1,l,mid);
            else return find_next(x<<1|1,mid+1,r);
        }
    
        inline int next(int x,int l,int r,int val){//查后缀
            int mid=(l+r)>>1,ans=0;
            if(val<l){
                if(t[x]) return find_next(x,l,r);
                return 0;
            }
            if(val<mid&&t[x<<1]&&(ans=next(x<<1,l,mid,val))) return ans;
            else return next(x<<1|1,mid+1,r,val);
        }
    }p;
    
    //あの一等星のさんざめく光で
    
  • 相关阅读:
    CODEVS——T 2618 核电站问题
    Spring使用AspectJ注解和XML配置实现AOP
    oracle存储过程
    oracle什么时候需要commit
    短信发送接口被恶意访问
    JAVA内存模型
    构造函数,静态代码块,构造代码块
    mybatis缓存
    volatile和synchronized
    利用反射创建对象必须要显式的声明构造方法吗?
  • 原文地址:https://www.cnblogs.com/wsyunine/p/14642084.html
Copyright © 2011-2022 走看看