这道题目其实是线段树,但是在一次比赛中由于数据比较弱,被我用一般的方法给水过了,学过线段树之后就又写了一遍!这道题就不翻译了,相信大家都能看懂!
直接贴代码:
# 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;
}