矩阵翻转爆0 样例过了

题目描述

题目描述:

读入一个 n*m 的 01 矩阵,q 次操作,每次将一个子矩阵内的 01 翻转,求最终的矩阵。

输入格式:

第一行三个整数 n,m,q

之后 n 行每行 m 个整数 0 或 1

之后 q 行,每行四个整数 x1,y1,x2,y2,表示要翻转矩阵的左上角和右下角。

输出格式:

输出一个矩阵表示答案

样例输入1

5 4 1
1 1 0 0
1 0 0 0
0 0 1 1
1 1 1 1
1 0 1 0
2 2 5 3

样例输出1

1 1 0 0
1 1 1 0
0 1 0 1
1 0 0 1
1 1 0 0

约定:

1 ≤ n,m ≤ 500, q ≤ 1000000

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n,m,q,b[501][501],x,y,xx,yy,c[501][501];
  bool a[501][501];
  cin>>n>>m>>q;
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      cin>>a[i][j];
      b[i][j]=0;
    }
  }for(int i=0;i<q;i++){
    cin>>x>>y>>xx>>yy;
    x--;y--;
    b[x][y]++;b[xx][y]--;
    b[x][yy]--;b[xx][yy]++;
  }for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(i==0||j==0)c[i][j]=b[i][j];
      else c[i][j]=b[i][j]+c[i-1][j]+c[i][j-1]-c[i-1][j-1];
      if(c[i][j]%2)a[i][j]=!a[i][j];
      cout<<a[i][j]<<" ";
    }cout<<"\n";
  }return 0;
}
2 个赞

差分数组要先求,不能直接用,公式你去看PPT

2 个赞

已AC,谢谢老师

2 个赞