nssl1467-U【差分】

正题


题目大意

n ∗ n n*n nn的矩阵,每次让一个下三角形内数字加上一定权值。求最后所有位置的异或和


解题思路

我们发现如果我们对于没行做前缀和的话,我们需要修改的位置就是一个竖直下去的一列和斜着的一条,所以我们可以分别对于竖着的和斜着的做一次差分,我们就可以求出该矩形的差分


c o d e code code

#include
#include
#include
#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);
}

你可能感兴趣的:(差分)