Mobile phones--POJ 1195

1、题目类型:模拟、计算几何、树状数组。

2、解题思路:题意,给定n*n矩阵,和几种在线操作,包括对某一点(x,y)值修改,查询一个矩形(x1,y1,x2,y2)的元素和。步骤,(1)树状数组的经典应用;(2)面积处理过程中,面积=Sum(R,T)-Sum(R,B-1)-Sum(L-1,T)+Sum(L-1,B-1)。

3、注意事项:注意貌似除了树状数组这种方法,其他的方法都TLE,面积处理时候,记得加上减去两次的部分Sum(L-1,B-1)。

4、实现方法:

#include<iostream>
using namespace std;

int N;
int C[1050][1050];

int Lowbit(int x)
{
return x&(-x);
}

void Modify(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;
int sum=0;
for(i=x;i>0;i-=Lowbit(i))
{
for(j=y;j>0;j-=Lowbit(j))
{
sum
+=C[i][j];
}
}
return sum;
}

int GetSum(int L,int B,int R,int T)
{
return Sum(R,T)-Sum(R,B-1)-Sum(L-1,T)+Sum(L-1,B-1);
}

int main()
{
int op,X,Y,A;
int L,B,R,T;
memset(C,
0,sizeof(C));
cin
>>op>>N;
while(cin>>op && op!=3)
{
if(op==1)
{
cin
>>X>>Y>>A;
Modify(X
+1,Y+1,A);
}
else
{
cin
>>L>>B>>R>>T;
cout
<<GetSum(L+1,B+1,R+1,T+1)<<endl;
}
}
return 0;
}

 

posted @ 2010-09-29 16:39  勇泽  阅读(300)  评论(0编辑  收藏  举报