2018国庆雅礼D3T1

对二维差分矩阵的总结:

1。任何直线形状的加法子块都可以构造差分前缀和

2。对于某种形状的差分矩阵的某个点,其影响的块为原形状倒过来的向右下方向无限扩展的矩阵

3。对于在矩阵中心出现的,不规则的加法子块,可将其拆为若干规则块的相加或相减。

代码:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 2010;
inline int qread() {
    register int x = 0, ch = getchar();
    while(!isdigit(ch))    ch = getchar();
    while(isdigit(ch))    x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
    return x;
}
long long D[maxn][maxn], DD[maxn][maxn];
long long E[maxn][maxn], EE[maxn][maxn]; 
long long ans;
int n, q;
int main(void) {
    n = qread(), q = qread();
    while(q--)     {
        int r = qread(), c = qread(), l = qread(), s = qread();
        E[r][c] += s;    E[r + l][c + l] -= s;
        D[r + l][c] -= s;    D[r + l][c + l] += s;
        D[n + 1][c] += s;    D[n + 1][c + l] -= s;
    }
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j){
            DD[i][j] = DD[i - 1][j] + DD[i][j - 1] - DD[i - 1][j - 1] + D[i][j];
            EE[i][j] = EE[i - 1][j] + EE[i - 1][j - 1] - (i > 1 ? EE[i - 2][j - 1] : 0) + E[i][j];
            ans ^= (DD[i][j] + EE[i][j]);
        }    
    printf("%lld\n", ans);    
}

 

posted @ 2018-10-11 16:47  junk_yao  阅读(506)  评论(0编辑  收藏  举报