计蒜客习题:矩阵操作

问题描述

给出 N×N 的矩阵 A,其中的元素是 0 或 1。初始时均为 0。
我们可以修改矩阵,给定左上角(x1,y1),和右下角 (x2,y2),对这个矩阵的所有元素执行取反操作,即 0 变成 1,1 变成 0。现在我们一共有两种操作:
C x1 y1 x2 y2 (1≤x1≤x2≤n,1≤y1≤y2≤n),修改矩形
Q x y(1≤x,y≤n) 查询 Ax+…+Ay 的值
输入格式
第一行两个整数 N,T(2≤N≤1000,1≤T≤50000)。
接下来 T 行,每行一个操作。
输出格式
对于每个查询操作,一行一个整数表示 A(xy)。
样例输入

2 10
C 2 1 2 2
Q 2 2
C 2 1 2 1
Q 1 1
C 1 1 2 1
C 1 2 1 2
C 1 1 2 2
Q 1 1
C 1 1 2 1
Q 2 1

样例输出

1
0
0
1

AC代码

#include <iostream>
#include <cstring>
#include <cstdio> 
using namespace std;
const int MAX_N=1050;
int C[MAX_N][MAX_N];
int n;

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

void change(int i,int j){
    for(int x=i;x<=n;x+=lowbit(x)){
        for(int y=j;y<=n;y+=lowbit(y)){
            if(C[x][y]==0)C[x][y]=1;
            else C[x][y]=0;
        }
    }
    return;
}

int getsum(int i,int j){
    long long int res=0;
    for(int x=i;x;x-=lowbit(x)){
        for(int y=j;y;y-=lowbit(y)){
            res+=C[x][y];
        }
    }
    return res;
}

int main() {
    memset(C,0,sizeof(C));
    cin>>n;
    int q;
    cin>>q;
    while(q--){
        char t;
        scanf(" %c",&t);
        if(t=='C'){
            int a,b,c,d;
            scanf("%d%d%d%d",&a,&b,&c,&d);
                    change(a,b);
                    change(a,d+1);
                    change(c+1,b);
                    change(c+1,d+1);
        }
        else{
            int a,b;
            scanf("%d%d",&a,&b);
            printf("%d\n",getsum(a,b)%2);
        }

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liukairui/article/details/80920233