20181101noip模擬賽T1
阿新 • • 發佈:2018-11-01
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 #definerij 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