zoukankan      html  css  js  c++  java
  • 模板 区间修改,区间查询

    模板一:区间增值,区间求和
        模板题:hud1556 Color the ball

    const int maxn=100010;
    int a[maxn],tree[4*maxn],lazy[4*maxn];
    
    void pushup(int o){
        tree[o]=tree[o<<1]+tree[o<<1|1];
    }
    
    void build(int o,int l,int r){
        lazy[o]=0;
        if(l==r){
            tree[o]=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build(o<<1,l,mid);
        build(o<<1|1,mid+1,r);
        pushup(o);
    }
    
    void pushdown(int o,int l,int r){
        if(lazy[o]==0) return;
        lazy[o<<1]+=lazy[o];
        lazy[o<<1|1]+=lazy[o];
        int mid=(l+r)>>1;
        tree[o<<1]+=lazy[o]*(mid-l+1);
        tree[o<<1|1]+=lazy[o]*(r-mid);
        lazy[o]=0;
    }
    
    void puttag(int o,int l,int r,int v){
        lazy[o]+=v;
        tree[o]+=v*(r-l+1);
    }
    
    void change(int o,int l,int r,int ql,int qr,int v){
        if(ql<=l && r<=qr){
            puttag(o,l,r,v);
            return;
        }
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        if(ql<=mid) change(o<<1,l,mid,ql,qr,v);
        if(qr>mid) change(o<<1|1,mid+1,r,ql,qr,v);
        pushup(o);
    }
    
    int query(int o,int l,int r,int ql,int qr){
        if(ql<=l && r<=qr) return tree[o];
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        int ans=0;
        if(ql<=mid) ans+=query(o<<1,l,mid,ql,qr);
        if(qr>mid) ans+=query(o<<1|1,mid+1,r,ql,qr);
        return ans; 
    }
    

    模板二:区间替换,区间求和
        模板题:hdu1698 Just a Hook

    const int maxn=100010;
    int a[maxn],tree[4*maxn],lazy[4*maxn];
    
    void pushup(int o){
        tree[o]=tree[o<<1]+tree[o<<1|1];
    }
    
    void build(int o,int l,int r){
        lazy[o]=0;
        if(l==r){
            tree[o]=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build(o<<1,l,mid);
        build(o<<1|1,mid+1,r);
        pushup(o);
    }
    
    void pushdown(int o,int l,int r){
        if(lazy[o]==0) return;
        lazy[o<<1]=lazy[o];
        lazy[o<<1|1]=lazy[o];
        int mid=(l+r)>>1;
        tree[o<<1]=lazy[o]*(mid-l+1);
        tree[o<<1|1]=lazy[o]*(r-mid);
        lazy[o]=0;
    }
    
    void puttag(int o,int l,int r,int v){
        lazy[o]=v;
        tree[o]=v*(r-l+1);
    }
    
    void change(int o,int l,int r,int ql,int qr,int v){
        if(ql<=l && r<=qr){
            puttag(o,l,r,v);
            return;
        }
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        if(ql<=mid) change(o<<1,l,mid,ql,qr,v);
        if(qr>mid) change(o<<1|1,mid+1,r,ql,qr,v);
        pushup(o);
    }
    
    int query(int o,int l,int r,int ql,int qr){
        if(ql<=l && r<=qr) return tree[o];
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        int ans=0;
        if(ql<=mid) ans+=query(o<<1,l,mid,ql,qr);
        if(qr>mid) ans+=query(o<<1|1,mid+1,r,ql,qr);
        return ans; 
    }
    
  • 相关阅读:
    【成功案例】智能企业的可持续转型
    【成功案例】三菱重工
    【成功案例】都乐(Dole)
    【成功案例】佳能
    【成功案例】DHL将美洲汇聚在一起
    【成功案例】Bantotal
    【成功案例】得益于GeneXus,毕马威墨西哥在员工培训方面节省了95%的费用
    GeneXus低码工具为美国最大的大学图书销售商之一解决了五个问题
    双均线系统
    价量时空交易系统
  • 原文地址:https://www.cnblogs.com/fxq1304/p/13069828.html
Copyright © 2011-2022 走看看