您的位置:首页 > 其它

hdu 1166 敌兵布阵 朴素线段树

2012-08-14 15:36 316 查看
#include<stdio.h>
#include<string.h>
#define MAX 1000001
int a[MAX],ci;
int find(int left,int right,int i,int j,int num)
{
int mid=(left+right)/2;
if(left==i&&right==j) return a[num];
else if(i==j) return a[i];
else if(i<=mid&&j>mid)
return find(mid+1,right,mid+1,j,2*num+1)+find(left,mid,i,mid,2*num);
else if(j<=mid) return find(left,mid,i,j,num*2);
else if(i>mid) return find(mid+1,right,i,j,num*2+1);
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
printf("Case %d:\n",cas);
memset(a,0,sizeof(a));
int n;ci=1;
scanf("%d",&n);
while(ci<=n) ci*=2;
for(int i=ci;i<ci+n;i++)
scanf("%d",&a[i]);
for(int i=ci-1;i>0;i--)
a[i]=a[2*i]+a[2*i+1];
char s[10];
while(scanf("%s",s)&&s[0]!='E')
{
//    for(int c=1;c<ci+n;c++)
//                                    printf("%d   ",a[c]);
//        printf("\n");
int i,j;
scanf("%d%d",&i,&j);
if(s[0]=='A')
for(int k=ci+i-1;k>0;k/=2)
a[k]+=j;
else if(s[0]=='S')
for(int k=ci+i-1;k>0;k/=2)
a[k]-=j;

else
{
int left=ci,right=ci*2-1;i=i+ci-1;j=ci+j-1;
if(i==j) printf("%d\n",a[i]);
else printf("%d\n",find(left,right,i,j,1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: