HDU 1166 敌兵布阵(线段树单点更新)

来源:互联网 发布:域名为什么会被墙 编辑:程序博客网 时间:2024/06/05 08:34
#include<iostream>using namespace std;const int maxn=200000+5;int n,a[maxn/4];struct Intervaltree{    int val[maxn];    void clear() {memset(val,0,sizeof(val));}    void build(int o,int L,int R)    {        if(L==R){            val[o]=a[L];            return ;        }        build(o*2+1,L,(L+R)/2);        build(o*2+2,(L+R)/2+1,R);        val[o]=val[o*2+1]+val[o*2+2];    }    void update(int o,int p,int L,int R,int v)    {        if(L==R){            val[o]+=v;            return ;        }        int mid=(L+R)/2;        if(p<=mid) update(o*2+1,p,L,mid,v);        else update(o*2+2,p,mid+1,R,v);        val[o]=val[o*2+1]+val[o*2+2];    }    int query(int o,int l,int r,int L,int R)    {        int v=0;        if(L<=l&&R>=r) return val[o];        int mid=(l+r)/2;        if(R<=mid) v+=query(o*2+1,l,mid,L,R);        else if(L>mid) v+=query(o*2+2,mid+1,r,L,R);        else v+=query(o*2+1,l,mid,L,R)+query(o*2+2,mid+1,r,L,R);        return v;    }};Intervaltree Interval;int main(){    int t;    scanf("%d",&t);    for(int i=1;i<=t;i++)    {        scanf("%d",&n);        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        Interval.clear();        Interval.build(0,1,n);        char cmd[10];        printf("Case %d:\n",i);        while(scanf("%s",cmd)&&cmd[0]!='E')        {            int a,b;            scanf("%d%d",&a,&b);            if(cmd[0]=='Q'){                printf("%d\n",Interval.query(0,1,n,a,b));            }            else if(cmd[0]=='A'){                Interval.update(0,a,1,n,b);            }            else{                Interval.update(0,a,1,n,-b);            }        }    }    return 0;}

0 0
原创粉丝点击