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; 
    }
    
  • 相关阅读:
    Exception in thread "main" java.io.IOException: Cannot run program "XX": CreateProcess error
    用eclipse打包mapreduce程序 运行出现解析路径错误的诡异问题
    HTMLParser学习笔记(一)
    Prim算法实现
    hadoop mapreduce 出现找不到 各种类的错误
    搜索引擎的基本原理
    ArrayList 和数组 在mapreduce编程中序列化
    读《做你自己》
    对于通过视频学习编程的建议
    长篇文档排版技巧
  • 原文地址:https://www.cnblogs.com/fxq1304/p/13069828.html
Copyright © 2011-2022 走看看