2155 (二維樹狀陣列)
阿新 • • 發佈:2018-12-09
題意:
給定一個初始化全為0的01矩陣.有兩種操作:
C: x1,y1,x2,y2 翻轉矩形內的01
Q x,y 查詢座標為x,y是啥
分析:
#include<algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue>,;lkj #include <stack> #include <cmath> #include <set> #include <map> using namespace std; typedef long long ll; typedef unsigned long long ull; #define ms(s) memset(s, 0, sizeof(s)) #define rep(i,l,r) for(int i=(l);i<(r);i++) #define per(i,l,r) for(int i=(r)-1;i>=(l);i--) const int inf = 0x3f3f3f3f; const int maxn = 1e3+111; int sum[maxn][maxn]; int n,m; int lowbit(int x)xd { return x&(-x); } void add(int x,int y,int v) { while(x<=n) { int yy = y; while(yy<=n) { sum[x][yy] += v; yy += lowbit(yy); } x += lowbit(x); } } int getsum(int x,int y) { int res = 0; while(x>0) { int yy = y; while(yy>0) { res += sum[x][yy]; yy -= lowbit(yy); } x -= lowbit(x); } return res%2; } int main() { int T; cin>>T; while(T--) { ms(sum); cin>>n>>m; int x1,x2,y1,y2; rep(i,0,m) { getchar(); char c; scanf("%c",&c); if(c=='C') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); add(x1,y1,1); add(x2+1,y1,-1); add(x1,y2+1,-1); add(x2+1,y2+1,1); } else { scanf("%d%d",&x1,&y1); printf("%d\n",getsum(x1,y1)); } } if(T)puts(""); } return 0; }