思路:刚开始初始化那张表,A表示1,B表示0,然后利用二维树状数组就开始搞了,悲剧开始了,边界条件判断错误。
当处理好之后,来了个TLE,打表建图不行,找规律建图。现在AC已经麻木了。。。。。。。。
#include<iostream> #include<algorithm> #include<cstdio> #include<string.h> #define maxn 1100 using namespace std; int map[maxn][maxn]; int vis[maxn][maxn]; int T,t,Q; int x1,y1,x2,y2,n1; int lowbit(int n) { return (-n)&n; } int get_sum(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+=map[i][j]; } return ans; } void up_data(int x,int y,int n) { for(int i=x; i<maxn; i+=lowbit(i)) for(int j=y; j<maxn; j+=lowbit(j)) { map[i][j]+=n; } } int get_MAX(int a,int b) { return a>b?a:b; } int get_MIN(int a,int b ) { return a>b?b:a; } int fabs(int a) { a>=0?a:-a; } int main() { char op; scanf("%d",&T); int tem; int step=0; for(int i=1; i<=1024; i++) for(int j=1; j<=1024; j++) { if((i % 2) == (j % 2)) up_data(j,i,1); } while(T--) { cin>>op; switch(op) { case 'R': { cin>>x1>>y1>>x2>>y2; int ret = get_sum(x2, y2); if(x1 > 1) ret -= get_sum(x1 - 1, y2); if(y1 > 1) ret -= get_sum(x2, y1 - 1); if(x1 > 1 && y1 > 1) ret += get_sum(x1 - 1, y1 - 1); cout<<ret<<" "<<(x2-x1+1)*(y2-y1+1)-ret<<endl; break; } case 'A': { cin>>x1>>y1; int ret = get_sum(x1, y1); if(x1 > 1) ret -= get_sum(x1 - 1, y1); if(y1 > 1) ret -= get_sum(x1, y1 - 1); if(x1 > 1 && y1 > 1) ret += get_sum(x1 - 1, y1 - 1); if(ret==0) up_data(x1,y1,1); break; } case 'B': { cin>>x1>>y1; int ret = get_sum(x1, y1); if(x1 > 1) ret -= get_sum(x1 - 1, y1); if(y1 > 1) ret -= get_sum(x1, y1 - 1); if(x1 > 1 && y1 > 1) ret += get_sum(x1 - 1, y1 - 1); if(ret==1) up_data(x1,y1,-1); break; } } } return 0; }