原题网址:
https://acm.hdu.edu.cn/showproblem.php?pid=1166
我的代码:
using namespace std;
#define int long long
int test,n,a[120005],segtree[120005],cnt,tag[120005];
string s;
void init(){
memset(segtree,0,sizeof segtree);
memset(tag,0,sizeof tag);
return;
}
void push_up(int rt){
segtree[rt]=segtree[rt*2]+segtree[rt*2+1];
}
void build(int L,int R,int rt){
tag[rt]=0;
if(L==R){
cin>>segtree[rt];
return;
}
build(L,(L+R)/2,rt*2);
build((L+R)/2+1,R,rt*2+1);
push_up(rt);
return;
}
void solve(int rt,int l,int r,int k){
tag[rt]=tag[rt]+k;
segtree[rt]=segtree[rt]+k*(r-l+1);
return;
}
void push_down(int rt,int l,int r){
int mid=(l+r)/2;
solve(rt*2,l,mid,tag[rt]);
solve(rt*2+1,mid+1,r,tag[rt]);
tag[rt]=0;
return;
}
void update(int nl,int nr,int l,int r,int rt,int k){
if(nl<=l&&r<=nr){
segtree[rt]+=k*(r-l+1);
tag[rt]+=k;
return;
}
push_down(rt,l,r);
int mid=(l+r)/2;
if(nl<=mid){
update(nl,nr,l,mid,rt*2,k);
}
if(nr>mid){
update(nl,nr,mid+1,r,rt*2+1,k);
}
push_up(rt);
}
int query(int q_x,int q_y,int l,int r,int rt){
int res=0;
if(q_x<=l&&r<=q_y){
return segtree[rt];
}
int mid=(l+r)/2;
push_down(rt,l,r);
if(q_x<=mid){
res+=query(q_x,q_y,l,mid,rt*2);
}
if(q_y>mid){
res+=query(q_x,q_y,mid+1,r,rt*2+1);
}
return res;
}
signed main(){
ios::sync_with_stdio(0);
cin>>test;
while(test--){
cout<<"Case "<<++cnt<<":"<<endl;
cin>>n;
init();
build(1,n,1);
while(cin>>s&&s[0]!='E'){
int a,b;
cin>>a>>b;
if(s[0]=='Q'){
cout<<query(a,b,1,n,1)<<endl;
}else if(s[0]=='A'){
update(a,a,1,n,1,b);
}else if(s[0]=='S'){
update(a,a,1,n,1,-b);
}
}
}
return 0;
}
为什么样例过了,感觉逻辑也没问题,但是WA?