模板 区间修改,区间查询

模板一:区间增值,区间求和
    模板题: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; 
}

模板三:区间加乘,区间求和

const int maxn=100010;
int n,m,p;
LL a[maxn],tree[4*maxn],lazy_add[4*maxn],lazy_mul[4*maxn];

void update_mul(int o,int l,int r,LL k){
    if(lazy_add[o]){
        tree[o]=tree[o]*k%p;
        lazy_mul[o]=lazy_mul[o]*k%p;
        lazy_add[o]=lazy_add[o]*k%p;
    }
    else{
        lazy_mul[o]=lazy_mul[o]*k%p;
        tree[o]=tree[o]*k%p;
    }
}

void update_add(int o,int l,int r,LL k){
    lazy_add[o]=(lazy_add[o]+k)%p;
    tree[o]=(tree[o]+k*((r-l+1)%p)%p)%p;
}

void pushup(int o){
    tree[o]=(tree[o<<1]+tree[o<<1|1])%p;
}

void pushdown(int o,int l,int r){
    if(lazy_mul[o]==1 && lazy_add[o]==0) return;
    int mid=(l+r)>>1;
    if(lazy_mul[o]!=1){
        update_mul(lson,lazy_mul[o]);
        update_mul(rson,lazy_mul[o]);
        lazy_mul[o]=1;
    }
    update_add(lson,lazy_add[o]);
    update_add(rson,lazy_add[o]);
    lazy_add[o]=0;
}

void build(int o,int l,int r){
    lazy_add[o]=0;
    lazy_mul[o]=1;
    if(l==r){
        tree[o]=a[l]%p;
        return;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    pushup(o);
}

void change_mul(int o,int l,int r,int ql,int qr,LL k){
    if(ql<=l && r<=qr){
        update_mul(o,l,r,k);
        return;
    }
    pushdown(o,l,r);
    int mid=(l+r)>>1;
    if(ql<=mid) change_mul(lson,ql,qr,k);
    if(qr>mid) change_mul(rson,ql,qr,k);
    pushup(o);
}

void change_add(int o,int l,int r,int ql,int qr,LL k){
    if(ql<=l && r<=qr){
        update_add(o,l,r,k);
        return;
    }
    pushdown(o,l,r);
    int mid=(l+r)>>1;
    if(ql<=mid) change_add(lson,ql,qr,k);
    if(qr>mid) change_add(rson,ql,qr,k);
    pushup(o);
}

LL query(int o,int l,int r,int ql,int qr){
    if(ql<=l && r<=qr){
        return tree[o];
    }
    pushdown(o,l,r);
    int mid=(l+r)>>1;
    LL ans=0;
    if(ql<=mid) ans=(ans+query(lson,ql,qr))%p;
    if(qr>mid) ans=(ans+query(rson,ql,qr))%p;
    return ans;
}
posted @ 2020-06-09 00:06  fxq1304  阅读(188)  评论(0编辑  收藏  举报