HDU 1166 敌兵布阵

来源:互联网 发布:sql游标的用法 编辑:程序博客网 时间:2024/06/05 03:59

线段树

单点更新


NotOnlySuccess版(耗用内存较小)

#include<bits/stdc++.h>#define lson l,m,rt<<1 //左儿子#define rson m+1,r,rt<<1|1 //右儿子const int maxn=50020;int sum[maxn<<2];void PushUP(int rt) //把当前结点的信息更新到父结点{sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt) //建树{if(l==r){scanf("%d",&sum[rt]);return ;}int m=(l+r)>>1;build(lson);build(rson);PushUP(rt);}void update(int p,int add,int l,int r,int rt) //单点更新{if(l==r){sum[rt]+=add;return ;}int m=(l+r)>>1;if(p<=m)        update(p,add,lson);else        update(p,add,rson);PushUP(rt);}int query(int L,int R,int l,int r,int rt) //区间求和{if(L<=l&&r<=R)return sum[rt];int m=(l+r)>>1;int ret=0;if(L<=m)        ret+=query(L,R,lson);if(R>m)        ret+=query(L,R,rson);return ret;}int main() {int T,n;scanf("%d",&T);for(int kase=1;kase<=T;kase++){printf("Case %d:\n",kase);scanf("%d",&n);build(1,n,1);char op[20];while(scanf("%s",op)){if(op[0]=='E')                break;int a,b;scanf("%d%d",&a,&b);if(op[0]=='Q')                printf("%d\n",query(a,b,1,n,1));else if(op[0]=='S')                update(a,-b,1,n,1);else                update(a,b,1,n,1);}}return 0;}

自己写的

#include<bits/stdc++.h>using namespace std;int a[50020<<2];struct node{    int l,r,mid,sum;}s[50020<<2];void build(int id,int l,int r){    s[id].l=l,s[id].r=r;    s[id].mid=(l+r)>>1;    if(l==r)        s[id].sum=a[l];    else    {        build(id<<1,l,s[id].mid);        build(id<<1|1,s[id].mid+1,r);        s[id].sum=s[id<<1|1].sum+s[id<<1].sum;    }}void update(int id,int p,int add){    s[id].sum+=add;    if(s[id].l==s[id].r)        return;    if(p<=s[id].mid)        update(id<<1,p,add);    else if(p>s[id].mid)        update(id<<1|1,p,add);}int query(int id,int l,int r){    if(l<=s[id].l&&r>=s[id].r)        return s[id].sum;    else if(l>s[id].mid)        return query(id<<1|1,l,r);    else if(r<=s[id].mid)        return query(id<<1,l,r);    else        return query(id<<1|1,l,r)+query(id<<1,l,r);}int main(){    int T,N,I,J;    char str[20];    scanf("%d",&T);    for(int kase=1;kase<=T;kase++)    {        printf("Case %d:\n",kase);        scanf("%d",&N);        for(int i=1;i<=N;i++)            scanf("%d",&a[i]);        build(1,1,N);        while(scanf("%s",str))        {            if(str[0]=='Q')            {                scanf("%d%d",&I,&J);                printf("%d\n",query(1,I,J));            }            else if(str[0]=='A')            {                scanf("%d%d",&I,&J);                update(1,I,J);            }            else if(str[0]=='S')            {                scanf("%d%d",&I,&J);                update(1,I,-J);            }            else                break;        }    }    return 0;}


0 0
原创粉丝点击