您的位置:首页 > 其它

poj 1195 Mobile phones

2016-05-23 21:14 375 查看
这道题的题意是先给一个数字i,假如i==0,就对将数组array初始化为0,i==1,随后给出x,y,data,然后使array[x][y] += data,i==3,随后给出x1,y1,x2,y2,

则输出sum(array[x1][y1]...array[x2][y2])

这一道题需要用到二维树状数组来做.

唯一要注意的是当输入数据中有0的存在时,数组可能访问到-1位置,所以对所有的坐标都+1

#include <cstdio>
#include <cstring>
using namespace std;
#define max_n 1200
int bit[max_n][max_n];
int n;
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int data)
{
int a,b;
for(a=x;a<=n;a+=lowbit(a))
for(b=y;b<=n;b+=lowbit(b))
{
bit[a][b] += data;
}
}
int sum(int x,int y)
{
int a,b;
int num = 0;
for(a=x;a>0;a-=lowbit(a))
for(b=y;b>0;b-=lowbit(b))
{
num+=bit[a][b];
}
return num;
}
int getsum(int x1,int y1,int x2,int y2)
{
return sum(x2,y2) - sum(x2,y1-1) - sum(x1-1,y2) + sum(x1-1,y1-1);
}
int main()
{
int op;
int x1,y1,x2,y2,data;
while(~scanf("%d",&op))
{
if(op==0)
{
scanf("%d",&n);
memset(bit,0,sizeof(bit));
}
if(op==1)
{
scanf("%d%d%d",&x1,&y1,&data);
add(++x1,++y1,data);
}
if(op==2)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",getsum(++x1,++y1,++x2,++y2));
}
if(op==3)
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: