E - Matrix (POJ - 2155)

- 题目大意

    有两种操作,C是每次操作可以是编辑某个矩形区域,这个区域的0改为1,1改为0,Q是每次查询只查询某一个点的值是0还是1。

- 解题思路

    可以利用树状数组来做,一维和二维都可以,我用的是二维,主要二维写起来方便。关于如何查询点的信息,画个图就可以很好理解了(查询单点类似于求和,就跟气球涂色一样)。

- 代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int n;
const int N=1e3+1;
int num[N][N];
char str[10];
int lowbit(int x)
{
    return x&(-x);
}
int sum(int x,int y)
{
   int re=0;
   for(int i=x;i>=1;i-=lowbit(i))
   {
       for(int j=y;j>=1;j-=lowbit(j))
        {
            re+=num[i][j];
        }
   }
   return re;
}

void add(int x,int y,int z)
{
     for(int i=x;i<=n;i+=lowbit(i))
   {
       for(int j=y;j<=n;j+=lowbit(j))
         {
             num[i][j]+=z;
         }
   }
}

int main()
{
    int t,m,a,b,c,d;
    scanf("%d",&t);
    while(t--)
    {
        memset(num,0,sizeof(num));
        scanf("%d%d",&n,&m);
        while(m--)
        {
            scanf("%s",str);
            if(str[0]=='C')
            {
                scanf("%d%d%d%d",&a,&b,&c,&d);
                add(a,b,1);
                add(c+1,b,1);
                add(a,d+1,1);
                add(c+1,d+1,1);
            }
            else if(str[0]=='Q')
          {
                scanf("%d%d",&a,&b);
                printf("%d\n",sum(a,b)%2);
          }
        }
        printf("\n");

    }
    return 0;
}

  

posted @ 2018-03-07 12:39  Alpacaddhh  阅读(177)  评论(0编辑  收藏  举报