码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2155 Matrix 二维树状数组

时间:2014-10-07 16:29:53      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:poj   树状数组   二维树状数组   

题目大意:有一个全零的矩阵,有两个操作。

1.修改(x1,y1)到(x2,y2)的数,使它们取异或。

2.查询(x,y)的状态。


思路:二维树状数组,区间修改,单点查询。


CODE:


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

int cases;
int cnt,asks;
bool arr_tree[MAX][MAX];
char s[10];

inline void Fix(int x,int y);
inline bool GetSum(int x,int y);

int main()
{
	for(cin >> cases;cases; --cases) {
		memset(arr_tree,false,sizeof(arr_tree));
		scanf("%d%d",&cnt,&asks);
		for(int i = 1;i <= asks; ++i) {
			scanf("%s",s);
			if(s[0] == 'C') {
				int x1,y1,x2,y2;
				scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
				Fix(x2,y2),Fix(x1 - 1,y1 - 1);
				Fix(x2,y1 - 1),Fix(x1 - 1,y2);
			}
			else {
				int x,y;
				scanf("%d%d",&x,&y);
				printf("%d\n",GetSum(x,y));
			}
		}
		puts("");
	}
	return 0;
}

inline void Fix(int x,int y)
{
	for(int i = x;i;i -= i&-i)
		for(int j = y;j;j -= j&-j)
			arr_tree[i][j] ^= 1;
}	

inline bool GetSum(int x,int y)
{
	bool re = 0;
	for(int i = x;i <= cnt;i += i&-i)
		for(int j = y;j <= cnt;j += j&-j)
			re ^= arr_tree[i][j];
	return re;
}


POJ 2155 Matrix 二维树状数组

标签:poj   树状数组   二维树状数组   

原文地址:http://blog.csdn.net/jiangyuze831/article/details/39854457

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!