本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000 
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
Description
Input
Output
Sample Input
1
2 10
C 2 1 2 2
Q 2 2
C 2 1 2 1
Q 1 1
C 1 1 2 1
C 1 2 1 2
C 1 1 2 2
Q 1 1
C 1 1 2 1
Q 2 1
Sample Output
1 0 0 1
正解:二维树状数组
解题报告:
推荐:2009年国家集训队论文:《浅谈信息学竞赛中的“0”和“1”》
我居然一开始没反应过来为什么只要改四个点就可以了QAQ
考虑我支持的是一个修改标记,通过一维的情况可以类比推理二维的情况,yy一下可以想清楚的。
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = 1011;
int n,m,c[MAXN][MAXN],x[2],y[2],ans;
char ch[12];
inline void add(int x,int y){ for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=n;j+=j&(-j)) c[i][j]++; }
inline int query(int x,int y){ int tot=0; for(int i=x;i>=1;i-=i&(-i)) for(int j=y;j>=1;j-=j&(-j)) tot+=c[i][j]; return tot; }
inline int getint(){
    int w=0,q=0; char c=getchar(); while((c<‘0‘||c>‘9‘) && c!=‘-‘) c=getchar();
    if(c==‘-‘) q=1,c=getchar(); while (c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar(); return q?-w:w;
}
inline void work(){
	int T=getint();
	while(T--){
		n=getint(); m=getint();
		memset(c,0,sizeof(c));
		while(m--) {
			scanf("%s",ch);
			if(ch[0]==‘C‘) {
				x[0]=getint(); y[0]=getint();
				x[1]=getint(); y[1]=getint();
				add(x[0],y[0]);
				add(x[0],y[1]+1);
				add(x[1]+1,y[0]);
				add(x[1]+1,y[1]+1);
			}
			else{
				x[0]=getint(); y[0]=getint();
				ans=query(x[0],y[0]);
				printf("%d\n",ans&1);
			}
		}
		printf("\n");
	}	
}
int main()
{
    work();
    return 0;
}
原文:http://www.cnblogs.com/ljh2000-jump/p/6277326.html