POJ 2155 二維樹狀數組+差分

題目大意:給定一個初始時全部爲0的n*n的矩陣,然後將一個子矩陣中的全部元素取反,詢問一個元素當前是什麼
思路:將取反操作當成轉化爲操作次數,容易得到若操作次數爲偶數則爲0否則爲1.將問題轉化爲區間修改+單點查詢.對於區間修改用差分實現,則答案爲所有前綴和.用樹狀數組維護即可
PS:這題輸入很噁心,數後還有一個空格

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e3+10;
int n,q,tr[N][N];
#define lowbit(x) ((x)&(-x))
void update(int idx,int idy,int val)
{
    for(int i=idx;i<=n;i+=lowbit(i)) 
        for(int j=idy;j<=n;j+=lowbit(j))
            tr[i][j]+=val;
}
int query(int idx,int idy)
{
    int ret=0;
    for(int i=idx;i;i-=lowbit(i)) 
        for(int j=idy;j;j-=lowbit(j)) 
            ret+=tr[i][j];
    return ret;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--) {
        scanf("%d%d ",&n,&q);
        memset(tr,0,sizeof(tr));
        for(int x1,x2,y1,y2,i=1;i<=q;i++) {
            char op[2]; scanf("%s",op);
            if(op[0]=='C') {
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);  
                update(x2+1,y2+1,1);
                update(x1,y2+1,-1);
                update(x2+1,y1,-1);
                update(x1,y1,1);
            } else {
                scanf("%d%d",&x1,&y1);
                printf("%d\n",query(x1,y1)%2);
            }
        }
        if(T) puts("");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章