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 ;
}

 

你可能感兴趣的:(mobile)