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);
}
1 X Y A 是在(X,Y)这个点加A
2 X1 Y1 X2 Y2
其中 开始是 0 s
思路:简单的二维树状数组
//4456K
#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)
{
}
int sum (int i,int j)
{
}
int main ()
{