hdu 1166 敌兵布阵

线段树 46MS

 

#include <stdio.h>

#define MAXN 50005

int number[MAXN];

struct STNode
{
    int l,r,num;
};
STNode node[MAXN*3];

void build(int a,int b,int idx)
{
    node[idx].l=a;
    node[idx].r=b;
    if(a==b)
    {
        node[idx].num=number[a];
        return;
    }
    int mid=(a+b)/2;
    build(a,mid,idx*2);
    build(mid+1,b,idx*2+1);
    node[idx].num = node[idx*2].num + node[idx*2+1].num;
}
void alter(int i,int v,int idx)
{
    node[idx].num+=v;
    if(i==node[idx].l && i==node[idx].r) return;
    if(i<=node[idx*2].r) alter(i,v,idx*2);
    else alter(i,v,idx*2+1);
}
int query(int a,int b,int idx)
{
    if(a<=node[idx].l && node[idx].r<=b)
    {
        return node[idx].num;
    }
    if(b<=node[idx*2].r) return query(a,b,idx*2);
    else if(a>=node[idx*2+1].l) return query(a,b,idx*2+1);
    else return query(a,node[idx*2].r,idx*2) + query(node[idx*2+1].l,b,idx*2+1);
}

int main()
{
    int T,n,i,j,cas=1;
    char oper[10];
    scanf("%d",&T);
    while(T--)
    {
        printf("Case %d:\n",cas++);
        scanf("%d",&n);
        for(i=1; i<=n; i++) scanf("%d",&number[i]);
        build(1,n,1);
        while(scanf("%s",oper))
        {
            if(oper[0]=='E') break;

            scanf("%d %d",&i,&j);
            if(oper[0]=='A')
            {
                alter(i,j,1);
            }
            else if(oper[0]=='S')
            {
                alter(i,-j,1);
            }
            else
            {
                printf("%d\n",query(i,j,1));
            }
        }
    }
    return 0;
}


//*****************************************************************************************************
树状数组 31MS

#include<stdio.h>
#include<string.h>

#define MAXN 50005

int n,c[MAXN];

inline int lowbit(int x)
{
    return x&(-x);
}

void update(int x,int val)
{
    while(x<=n)
    {
        c[x]+=val;
        x+=lowbit(x);
    }
}

int getSum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
    #endif
    int T,cas,i,j,t;
    char str[6];
    scanf("%d",&T);
    for(cas=1;cas<=T;cas++)
    {
        memset(c,0,sizeof(c));
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&t);
            update(i,t);
        }
        printf("Case %d:\n",cas);
        while(scanf("%s",str),str[0]!='E')
        {
            scanf("%d %d",&i,&j);
            if(str[0]=='A') update(i,j);
            else if(str[0]=='S') update(i,-j);
            else printf("%d\n",getSum(j)-getSum(i-1));
        }
    }
    return 0;
}

posted @ 2010-09-01 15:43  菜到不得鸟  阅读(160)  评论(0)    收藏  举报