本文共 757 字,大约阅读时间需要 2 分钟。
n ∗ n n*n n∗n的矩阵,每次让一个下三角形内数字加上一定权值。求最后所有位置的异或和
我们发现如果我们对于没行做前缀和的话,我们需要修改的位置就是一个竖直下去的一列和斜着的一条,所以我们可以分别对于竖着的和斜着的做一次差分,我们就可以求出该矩形的差分
#include#include #include #define ll long longusing 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);}
转载地址:http://ndwaf.baihongyu.com/