POJ 1195 Mobile phones【树状数组】

题意: 一组造作:

         0  n             创建一个 n*n 的矩形。

         1 x y num    在(x,y)位置加上值 num。

         2 l b r t       输出矩阵 l<=x<=r,b<=y<=t 内所有数值和。

         3                退出。

分析: 二维树状数组。

#include<stdio.h>
#include<string.h>
int a[1025][1025];
int n;
int lowbit(int x)
{
    return (x)&(-x);
}
void add(int x,int y,int num)
{
    while(x<=n)
    {
        int ty=y;
        while(ty<=n)
        {
            a[x][ty]+=num;
            ty+=lowbit(ty);
        }
        x+=lowbit(x);
    }
}
int sum(int x,int y)
{
    if(x==0||y==0)
        return 0;
    int sum=0;
    while(x>0)
    {
        int ty=y;
        while(ty>0)
        {
            sum+=a[x][ty];
            ty-=lowbit(ty);
        }
        x-=lowbit(x);
    }
    return sum;
}
int main()
{
    int p,x,y,num,l,b,r,t,i,j;
    while(scanf("%d",&p)!=EOF)
    {
        if(p==0)
        {
            scanf("%d",&n);
            for(i=0;i<=n;i++)
                for(j=0;j<=n;j++)
                    a[i][j]=0;
        }
        else if(p==1)
        {
            scanf("%d%d%d",&x,&y,&num);
            x++; y++;
            add(x,y,num);
        }
        else if(p==2)
        {
            scanf("%d%d%d%d",&l,&b,&r,&t);
            l++; b++; r++; t++;
            printf("%d\n",sum(r,t)-sum(r,b-1)-sum(l-1,t)+sum(l-1,b-1));
        }
        else break;
    }
    return 0;
}

 

posted @ 2012-08-07 11:11  'wind  阅读(160)  评论(0编辑  收藏  举报