分块的单点修改查询区间和_模版 单点修改,区间查询
模板一:單點修改,區間求和
模板題:hdu1166 敵兵布陣
const int maxn=100010;
int a[maxn],tree[4*maxn];
void pushup(int o){
tree[o]=tree[o<<1]+tree[o<<1|1];
}
void build(int o,int l,int r){
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 change(int o,int l,int r,int x,int k){
if(l==r){
tree[o]+=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) change(o<<1,l,mid,x,k);
else change(o<<1|1,mid+1,r,x,k);
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,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;
}
模板二:單點修改,區間最值
模板題:hdu1754 I Hate It
const int maxn=100010;
int a[maxn],tree[4*maxn];
void pushup(int o){
tree[o]=max(tree[o<<1],tree[o<<1|1]);
}
void build(int o,int l,int r){
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 change(int o,int l,int r,int x,int k){
if(l==r){
tree[o]=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) change(o<<1,l,mid,x,k);
else change(o<<1|1,mid+1,r,x,k);
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,ans=-1;
if(ql<=mid) ans=max(ans,query(o<<1,l,mid,ql,qr));
if(qr>mid) ans=max(ans,query(o<<1|1,mid+1,r,ql,qr));
return ans;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的分块的单点修改查询区间和_模版 单点修改,区间查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: renameto 阻塞_打造简化版文件下
- 下一篇: .vb.net 执行js方法_Deno的