Acwing 5396题

这里主要是运用了前缀和和差分的知识,对于差分数列和前缀和有一定的了解,这里就是个模板题而已

如果忘记或者不知道的话,建议可以从这个网址当中看相关的知识点,讲的很清楚

前缀和 - 知乎 (zhihu.com)

差分 - 知乎 (zhihu.com)

前缀和和差分就是一个互逆的运算,这一点也可以在上面两个网址中了解到。

这里就是一个二维差分,因为对于每个操作都有范围,所以也就是对于这个二维数组某个点到另一个点的区域进行改变,这里说是翻转,其实可以理解为加1,是2的偶数的话那么就是没变,因为翻转了两次,等于还是没变,要是奇数那么就是相反的了。所以对于2取余判断即可。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 3000
using namespace std;
int b[MAX][MAX];
void insert(int x1,int y1,int x2,int y2){
    b[x1][y1]++;
    b[x2+1][y1]--;
    b[x1][y2+1]--;
    b[x2+1][y2+1]++;
}
int main(){
    int arr[MAX][MAX];
    int i,j;
    int n,m;
    cin>>n>>m;
    int x1,x2,y1,y2;
    while(m--){
        cin>>x1>>y1>>x2>>y2;
        insert(x1,y1,x2,y2);
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
        }
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            if(b[i][j]%2==0){
                cout<<0;
            }
            else
            cout<<1;
        }
        puts(" ");
    }
    
    
    
    return 0;
}

你可能感兴趣的:(算法)