poj 1195 Mobile phones(二维树状…

来源:互联网 发布:java使用qq邮箱发邮件 编辑:程序博客网 时间:2024/04/27 10:06
题意:讲的是在一个S*S的正方形内,有两种操作 
1 X Y A 是在(X,Y)这个点加A
2 X1 Y1 X2 Y2  查询(X1,Y1) 到 (X2,Y2) 这范围内手机的数量

其中 开始是 0 s  表示有一个S*S的区域 3表示结束

思路:简单的二维树状数组   ans = sum(x2+1,y2+1) - sum(x2+1,y1) - sum(x1,y2+1) + sum (x1,y1);

//4456K   563MS

#include <stdio.h>
#include <string.h>
#define lowbit(x) (x&(-x))
#define M 1050
int ar[M][M];
int n;

void add (int i,int j,int w)
{
    inttmp;
    while (i<= n)
    {
       tmp = j;
       while (tmp <= n)
       {
           ar[i][tmp] += w;
           tmp += lowbit(tmp);
       }
       i += lowbit(i);
    }
}
int sum (int i,int j)
{
    int tmp,ans= 0;
    while (i> 0)
    {
       tmp = j;
       while (tmp > 0)
       {
           ans += ar[i][tmp];
           tmp -= lowbit(tmp);
       }
       i -= lowbit(i);
    }
    returnans;
}
int main ()
{
    intop,x1,x2,y1,y2,w;
    memset(ar,0,sizeof(ar));
    while (scanf("%d",&op))
    {
       if (op == 0)
       {
           scanf ("%d",&n);
           ++n;
       }
       if (op == 1)
       {
           scanf ("%d %d%d",&x1,&y1,&w);
           add (x1+1,y1+1,w);
       }
       if (op == 2)
       {
           scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
           int ans = sum (x2+1,y2+1) - sum(x2+1,y1) - sum(x1,y2+1) + sum(x1,y1);
           printf ("%d\n",ans);
       }
       if (op == 3)
           break;
    }
    return0;
}

原创粉丝点击