HDU1166敌兵布阵

来源:互联网 发布:淘宝大数据平台架构 编辑:程序博客网 时间:2024/06/14 07:58

HDU1166敌兵布阵
简单的线段树,单点更新及区间求和,不需优化,更新到叶子节点

#include<cstdio>struct node{    int left,right;    int sum;}tree[50000*4];int p,add;void Build(int l,int r,int cur){    tree[cur].left=l;    tree[cur].right=r;    if(l==r){        scanf("%d",&tree[cur].sum);        return ;    }    int mid=(l+r)/2;    Build(l,mid,cur*2);    Build(mid+1,r,cur*2+1);    tree[cur].sum=tree[cur*2].sum+tree[cur*2+1].sum;}void Update(int cur){    if(tree[cur].left==tree[cur].right&&tree[cur].left==p){        tree[cur].sum+=add;        return ;    }    int mid=(tree[cur].left+tree[cur].right)/2;    if(p<=mid)Update(cur*2);    else Update(cur*2+1);    tree[cur].sum=tree[cur*2].sum+tree[cur*2+1].sum;}int Query(int l,int r,int cur){    if(l==tree[cur].left&&r==tree[cur].right)return tree[cur].sum;    int mid=(tree[cur].left+tree[cur].right)/2;    if(r<=mid)return Query(l,r,cur*2);    else if(l>mid)return Query(l,r,cur*2+1);    else return Query(l,mid,cur*2)+Query(mid+1,r,cur*2+1);}int main(){    int T,n,a,b;    char ch[10];    scanf("%d",&T);    for(int t=1;t<=T;t++){        printf("Case %d:\n",t);        scanf("%d",&n);        Build(1,n,1);        while(1){            scanf("%s",ch);            if(ch[0]=='E')break;            scanf("%d%d",&a,&b);            if(ch[0]=='Q')printf("%d\n",Query(a,b,1));            else if(ch[0]=='A'){p=a;add=b;Update(1);}            else{p=a;add=-b;Update(1);}        }    }    return 0;}
0 0
原创粉丝点击