CDOJ1601 - 二維樹狀數組 (2017 UESTC Training for Data Structures)

傳送門:CDOJ1601


題目思路:

題目可以抽象爲在一個座標系中初始時所有點都爲0,然後有m次操作,有兩種

1,將一個矩形中的所有點都異或1,0變1,1變0,

2,查詢一個點的數


題目思路:

這種題可以是一個一維問題擴棧而來,一維就是在x軸上,矩形變成一段區間,對於一維我們只需在

a[l]+1,a[r+1]-1,當查詢是質詢查詢改點左邊的前綴和,因爲在區間內左邊有個+1區間外面抵消了,

而維護前綴和用個一維樹狀數組就可有,而這題我們可以用二維樹狀數組來維護,然後就是更新在那個

要變化,首先 (x1,y1) +1 ,因爲在區間都要保證有個加一,所以我們可以想到在(x1,y2+1)和(x2+1,y1) -1

然後還要個加一來抵消,那就是(x2+1,y2+1)


AC代碼:


#include<bits/stdc++.h>
using namespace std;

int a[1005][1005];

int get(int x){return x&(-x);}

void add(int x,int y,int v)
{
    for(;x<=1000;x+=get(x))
    {
        for(int i=y;i<=1000;i+=get(i))
        {
            a[x][i]+=v;
        }
    }
}

int sum(int x,int y)
{
    int res= 0;
    for(;x>0;x-=get(x))
    {
        for(int i=y;i>0;i-=get(i))
        {
            res+=a[x][i];
        }
    }
    return res;
}

int main()
{
    int t;cin>>t;
    while(t--)
    {
        int q;scanf("%d",&q);
        memset(a,0,sizeof(a));
        while(q--)
        {
            char ch[5];
            int a,b,c,d;
            scanf("%s",ch);
            if(ch[0]=='C')
            {
                scanf("%d%d%d%d",&a,&b,&c,&d);
                add(a,b,1);
                add(c+1,d+1,1);
                add(a,d+1,-1);
                add(c+1,b,-1);
            }
            else
            {
                scanf("%d%d",&a,&b);
                int ans = sum(a,b);
                printf("%d\n",ans%2);

            }
        }
    }
    return 0;
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章