欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

E - Matrix (POJ - 2155)

程序员文章站 2022-07-12 17:32:22
...

- 题目大意

    有两种操作,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;
}