LKOJ20201119Contest
\(T1.\quad u\qquad\)(差分)
看到这种多次修改、最终查询的题目就应该想到差分。
那么这道题维护下三角,即是斜着差分,三角有下界,即是横着差分。
斜着和横着分别求过前缀和后,再竖着求一遍前缀和即是原数组。
改题代码:
#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\n",ans);
return 0;
}
\(T2.\quad v\)
\(T3.\quad w\)
\(T4.\quad y\)