概述
#include <bits/stdc++.h>
#define maxn 200010
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std;
int Sum[maxn<<2],Lazy[maxn<<2];
int A[maxn];
void PushUp(int rt){Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];}
int N,Q,lq,rq,val;
void Build(int l,int r,int rt){
if(l==r) {
Sum[rt] = A[l];
return;
}
int m=(l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void UpdatePoint(int L,int C,int l,int r,int rt){
if(l==r){
Sum[rt]+=C;
return;
}
int m=(l+r)>>1;
if(L <= m) UpdatePoint(L,C,l,m,rt<<1);
else UpdatePoint(L,C,m+1,r,rt<<1|1);
PushUp(rt);
}
void PushDown(int rt,int ln,int rn){
if(Lazy[rt]){
Lazy[rt<<1] = Lazy[rt];
Lazy[rt<<1|1] = Lazy[rt];
Sum[rt<<1] = Lazy[rt]*ln;
Sum[rt<<1|1] = Lazy[rt]*rn;
Lazy[rt]=0;
}
}
void UpdateInterval(int L,int R,int C,int l,int r,int rt){
if(L <= l && r <= R){
Sum[rt] = C*(r-l+1);
Lazy[rt] = C;
return ;
}
int m=(l+r)>>1;
PushDown(rt,m-l+1,r-m);
if(L <= m) UpdateInterval(L,R,C,l,m,rt<<1);
if(R > m) UpdateInterval(L,R,C,m+1,r,rt<<1|1);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
return Sum[rt];
}
int m = (l+r)>>1;
PushDown(rt,m-l+1,r-m);
int ANS = 0;
if(L <= m) ANS += Query(L,R,l,m,rt<<1);
if(R > m) ANS += Query(L,R,m+1,r,rt<<1|1);
return ANS;
}
int main()
{
int n,t;
char ss[20];
cin>>t;
for(int i = 1;i<=t;++i){
printf("Case %d:n",i);
cin>>n;
for(int j=1;j<=n;j++) cin>>A[j];
Build(1,n,1);
while(scanf("%s",ss) && ss[0] != 'E'){
if(ss[0] == 'Q'){
int L,R;
scanf("%d%d",&L,&R);
printf("%dn",Query(L,R,1,n,1));
}else if(ss[0] == 'A'){
int L,c;
scanf("%d%d",&L,&c);
UpdatePoint(L,c,1,n,1);
}else if(ss[0] == 'S'){
int L,c;
scanf("%d%d",&L,&c);
UpdatePoint(L,-c,1,n,1);
}
}
}
return 0;
}
最后
以上就是俭朴蜜粉为你收集整理的HDOJ 1166 敌兵布阵(线段树 单点更新 区间求和)的全部内容,希望文章能够帮你解决HDOJ 1166 敌兵布阵(线段树 单点更新 区间求和)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复