您的位置:首页 > 其它

poj 2155 二维树状数组

2014-07-16 20:21 302 查看
还是注意向上向下更新,一对点表示包含一个区域

AC代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAX_N = 1000;

int sum[MAX_N+5][MAX_N+5];
int N;

inline int lowbit( int x ){
return x & ( -x );
}

void updata( int x, int y, int val ){
for( int i = x; i <= N; i += lowbit( i ) ){
for( int j = y; j <= N; j += lowbit( j ) ){
sum[i][j] = ( sum[i][j] + val ) % 2;
}
}
}

int getsum( int x, int y ){
int ans = 0;
for( int i = x; i > 0; i -= lowbit( i ) ){
for( int j = y; j > 0; j -= lowbit( j ) ){
ans = ( sum[i][j] + ans ) % 2;
}
}
return ans;
}

int main(){
int T;

scanf( "%d", &T );
while( T-- ){
int temp;
scanf( "%d%d", &N, &temp );
memset( sum, 0, sizeof( sum ) );
while( temp-- ){
char t[10];
scanf( "%s", t );
if( t[0] == 'C' ){
int temp1, temp2, temp3, temp4;
scanf( "%d%d%d%d", &temp1, &temp2, &temp3, &temp4 );
updata( temp1, temp2, 1 );
updata( temp1, temp4 + 1, 1 );
updata( temp3 + 1, temp2, 1 );
updata( temp3 + 1, temp4 + 1, 1 );
}else{
int temp1, temp2;
scanf( "%d%d", &temp1, &temp2 );
printf( "%d\n", getsum( temp1, temp2 ) );
}
}
printf( "\n" );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: