poj 1195 Mobile phones
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 10930 | Accepted: 5002 |
Description
Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.
Input
The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4 * 4, we have 0 <= X <= 3 and 0 <= Y <= 3.
Table size: 1 * 1 <= S * S <= 1024 * 1024
Cell value V at any time: 0 <= V <= 32767
Update amount: -32768 <= A <= 32767
No of instructions in input: 3 <= U <= 60002
Maximum number of phones in the whole table: M= 2^30
Output
Sample Input
0 4 1 1 2 3 2 0 0 2 2 1 1 1 2 1 1 2 -1 2 1 1 2 3 3
Sample Output
3 4
Source
题意:二维树状数组p[i][j]代表的i-lowbit(i)+1 to i ,j-lowbit(j)+1 to j 这个矩阵的和,insert和getsum函数做了一下改变,用两个for来实现插入和求和。又忘记 树状数组 不能为 0,调试了一会,再就是 对求某个区间的和,还是不是很熟悉wa了几次。如求(x1,y1)到(x2,y2)的和,画画图像可以很快得到公式。
getsum(x2,y2)+getsum(x1-1,y1-1)-getsum(x2,y1-1)-getsum(x1-1,y2);
AC代码:
#include <stdio.h>
int n;
int c[1500][1500];
int lowbit( int x)
{
return x&(-x);
}
void updata( int x,int y,int a)
{
int i,j;
for( i=x;i<=n;i+=lowbit(i))
{
for( j=y;j<=n;j+=lowbit(j))
{
c[i][j]+=a;
}
}
}
int sum( int x,int y)
{
int i,j,s=0;
for( i=x;i>0;i-=lowbit(i))
{
for( j=y;j>0;j-=lowbit(j))
{
s+=c[i][j];
}
}
return s;
}
int main( )
{
int x1,y1,x2,y2,a;
int index1;
while(scanf("%d",&index1)!=EOF)
{
int i,j;
if(index1>=3) break;
if(index1==1)
{
scanf("%d%d%d",&x1,&y1,&a);
x1++;y1++;
updata(x1,y1,a);
}
if(index1==0)
{
scanf("%d",&n);
n++;
for( i=0;i<=n;i++)
{
for( j=0;j<=n;j++)
{
c[i][j]=0;
}
}
}
if(index1==2)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;y1++;
x2++;y2++;
int xx=sum(x2,y2)+sum(x1-1,y1-1)-sum(x2,y1-1)-sum(x1-1,y2);
printf("%d\n",xx);
}
}
return 0;
}