LKOJ20201119Contest

比赛入口

(T1.quad uqquad)(差分)

看到这种多次修改、最终查询的题目就应该想到差分。

那么这道题维护下三角,即是斜着差分,三角有下界,即是横着差分。

斜着和横着分别求过前缀和后,再竖着求一遍前缀和即是原数组。

改题代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f; 
}
const int maxn=2050;
int n,q,r,c,l,s,a[maxn][maxn],b[maxn][maxn];
signed main(){
	freopen("u.in","r",stdin);
	freopen("u.out","w",stdout);
	n=read(),q=read();
	for(int i=1;i<=q;i++){
		r=read(),c=read();
		l=read(),s=read();
		a[r][c]+=s;
		a[r+l][c+l]-=s;
		b[r+l][c]-=s;
		b[r+l][c+l]+=s;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]+=a[i-1][j-1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			b[i][j]+=b[i][j-1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=a[i][j]+a[i-1][j]+b[i][j];
	/*
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
			printf("%d ",a[i][j]);
		puts("");
	}
	*/
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			ans^=a[i][j];
	printf("%lld
",ans);
	return 0;
}

(T2.quad v)

(T3.quad w)

(T4.quad y)

原文地址:https://www.cnblogs.com/syzf2222/p/14018122.html