1. 程式人生 > >20181101noip模擬賽T1

20181101noip模擬賽T1

algo 我們 string fin 模擬 http img sign 分享

技術分享圖片

思路:

我們看到這道題,可以一眼想到一維差分

但這樣的復雜度是O(nq)的,顯然會T

那麽怎麽優化呢?

我們會發現,差分的時候,在r~r+l-1的範圍內

差分增加的值橫坐標相同,縱坐標遞增

減小的值橫坐標和縱坐標都以1為公差遞增

那麽,我們就可以將差分數組差分

每次標記(r,c)(r,c+1),(r+l,c)(r+l,c+l)即可

代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define
rij register int j #define int long long using namespace std; int cf1[2005][2005],cf2[2005][2005],x[2005][2005]; int n,q,r,c,l,s; inline int rd(){ int y=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch==-?0:1;ch=getchar();} while(isdigit(ch)) {y=(y<<1)+(y<<3)+ch-0;ch=getchar();}
return f?y:-y; } signed main() { freopen("u.in","r",stdin); freopen("u.out","w",stdout); n=rd(),q=rd(); for(rii=1;i<=q;i++) { r=rd(),c=rd(),l=rd(),s=rd(); cf1[r][c]+=s; cf1[r+l][c]-=s; cf2[r][c+1]+=s; cf2[r+l][c+l+1]-=s; }
for(rij=1;j<=n;j++) { for(rii=1;i<=n;i++) { cf1[i][j]+=cf1[i-1][j]; } } for(rii=1;i<=n;i++) { for(rij=1;j<=n;j++) { cf2[i][j]+=cf2[i-1][j-1]; } } for(rii=1;i<=n;i++) { for(rij=1;j<=n;j++) { x[i][j]+=x[i][j-1]+cf1[i][j]-cf2[i][j]; } } int ans=0; for(rii=1;i<=n;i++) { for(rij=1;j<=n;j++) { ans^=x[i][j]; } } printf("%lld",ans); return 0; }

20181101noip模擬賽T1