正题
题目大意
n∗nn*nn∗n的矩阵,每次让一个下三角形内数字加上一定权值。求最后所有位置的异或和
解题思路
我们发现如果我们对于没行做前缀和的话,我们需要修改的位置就是一个竖直下去的一列和斜着的一条,所以我们可以分别对于竖着的和斜着的做一次差分,我们就可以求出该矩形的差分
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2100;
ll n,q,a[N][N],b[N][N],s[N][N],ans;
int main()
{scanf("%lld%lld",&n,&q);while(q--){ll x,y,l,s;scanf("%lld%lld%lld%lld",&x,&y,&l,&s);l=min(l,n);a[x][y]+=s;a[x+l][y]-=s;b[x][y+1]+=s;b[x+l][y+l+1]-=s;}for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)a[i][j]+=a[i-1][j],s[i][j]+=a[i][j];for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)b[i][j]+=b[i-1][j-1],s[i][j]-=b[i][j];for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)s[i][j]+=s[i][j-1],ans=ans^s[i][j];printf("%lld",ans);
}