hdu1166 敌兵布阵 树状数组

来源:互联网 发布:macbook 删除软件 编辑:程序博客网 时间:2024/04/29 07:57
第一行一个整数T,表示有T组数据。
每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。
接下来每行有一条命令,命令有4种形式:
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;

(4)End 表示结束,这条命令在每组数据最后出现;


还是查询和更新操作,树状数组~

#include<stdio.h>#include<string.h>#include<math.h>int c[50005];int n;int lowbit(int x){    return x&(-x);}void modify(int i,int j)//修改{    while(i<=n)    {        c[i]+=j;        i=i+lowbit(i);    }}long long sum(int i)//求和{    long long s=0;    while(i>0)    {        s+=c[i];        i=i-lowbit(i);    }    return s;}int main(){    int T,a;    scanf("%d",&T);    for(int t=1;t<=T;t++)    {        memset(c,0,sizeof(c));        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a);            modify(i,a);        }        char str[10];        scanf("%s",str);        printf("Case %d:\n",t);        while(strcmp(str,"End")!=0)        {            int x,y;            scanf("%d%d",&x,&y);            if(strcmp(str,"Query")==0)                printf("%lld\n",sum(y)-sum(x-1));            else if(strcmp(str,"Add")==0)                modify(x,y);            else if(strcmp(str,"Sub")==0)                modify(x,(-1)*y);            scanf("%s",str);        }    }}




0 0
原创粉丝点击