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