对二维差分矩阵的总结:
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); }