这道题目其实是线段树,但是在一次比赛中由于数据比较弱,被我用一般的方法给水过了,学过线段树之后就又写了一遍!这道题就不翻译了,相信大家都能看懂!

直接贴代码:

# 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;
}

posted on 2010-08-21 17:27  奋斗青春  阅读(487)  评论(0编辑  收藏  举报