敌兵布阵(树状数组)

来源:互联网 发布:2016年外汇储备数据 编辑:程序博客网 时间:2024/06/06 02:44

参考题解:http://gzhu-101majia.iteye.com/blog/1142115

好神奇的算法,看了一天才把这题看懂

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,a[50000+5];char str[10];int lowbit(int i){    return i&(-i);}void update(int i,int val){    while(i<=n)    {        a[i]+=val;        i+=lowbit(i);    }}int sum(int i){    int s=0;    while(i>0)    {        s+=a[i];        i-=lowbit(i);    }    return s;}int main(){    int t,val,cas=1,x,y;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)        {            scanf("%d",&val);            update(i,val);        }        printf("Case %d:\n",cas++);        while(~scanf("%s",str))        {            if(str[0]=='E')                break;            scanf("%d%d",&x,&y);            if(str[0]=='A')                update(x,y);            else if(str[0]=='S')                update(x,-y);            else                printf("%d\n",sum(y)-sum(x-1));        }    }    return 0;}

0 0
原创粉丝点击