这道题目其实是线段树,但是在一次比赛中由于数据比较弱,被我用一般的方法给水过了,学过线段树之后就又写了一遍!这道题就不翻译了,相信大家都能看懂!
直接贴代码:
# include<stdio.h> # include<string.h> struct node { int left,right,mid; int num;//num表示该节点包含有多少个士兵 }a[140000]; int st[50005],sum; void make(int s,int t,int step) { a[step].left=s; a[step].right=t; a[step].mid=(s+t)/2; if(s==t) {a[step].num=st[s];return;} make(s,a[step].mid,step*2); make(a[step].mid+1,t,step*2+1); a[step].num=a[step*2].num+a[step*2+1].num; } void add(int step,int ans1,int ans2) { a[step].num+=ans2; if(a[step].right==a[step].left) return; if(ans1<=a[step].mid) add(2*step,ans1,ans2); else add(2*step+1,ans1,ans2); } void find(int ans1,int ans2,int step) { if(a[step].left==ans1 && a[step].right==ans2) {sum+=a[step].num; return;} if(ans2<=a[step].mid) find(ans1,ans2,2*step); else if(ans1>a[step].mid) find(ans1,ans2,2*step+1); else { find(ans1,a[step].mid,2*step); find(a[step].mid+1,ans2,2*step+1); } } int main() { int i,n,t,ans1,ans2,ncase; char str[30]; scanf("%d",&t); for(ncase=1;ncase<=t;ncase++) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&st[i]); make(1,n,1); printf("Case %d:\n",ncase); while(scanf("%s",str)!=EOF) { if(strcmp(str,"End")==0) break; scanf("%d%d",&ans1,&ans2); if(strcmp(str,"Add")==0) add(1,ans1,ans2); else if(strcmp(str,"Sub")==0){ans2=-ans2;add(1,ans1,ans2);} else { sum=0; find(ans1,ans2,1); printf("%d\n",sum); } } } return 0; }