碼農
阿新 • • 發佈:2020-08-07
https://www.luogu.com.cn/problem/P2363
#include<bits/stdc++.h> using namespace std; int a[2100][2100],dp[2280][2280],f[10111000]; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1; for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x; } int main() { int n,ans=0; memset(f,0,sizeof(f)); read(n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { read(a[i][j]);dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j]; } for(int ki=1;ki<=n;ki++) for(int kj=1;kj<=n;kj++) { for(int i=1;i<=ki;i++) for(int j=1;j<=kj;j++) f[dp[ki][kj]-dp[ki][j-1]-dp[i-1][kj]+dp[i-1][j-1]]++; for(int i=ki+1;i<=n;i++) for(int j=kj+1;j<=n;j++) ans+=f[dp[i][j]-dp[i][kj]-dp[ki][j]+dp[ki][kj]]; for(int i=1;i<=ki;i++) for(int j=1;j<=kj;j++) f[dp[ki][kj]-dp[ki][j-1]-dp[i-1][kj]+dp[i-1][j-1]]=0; for(int i=1;i<=ki;i++) for(int j=kj+1;j<=n;j++) f[dp[ki][j]-dp[ki][kj]-dp[i-1][j]+dp[i-1][kj]]++; for(int i=ki+1;i<=n;i++) for(int j=1;j<=kj;j++) ans+=f[dp[i][kj]-dp[i][j-1]-dp[ki][kj]+dp[ki][j-1]]; for(int i=1;i<=ki;i++) for(int j=kj+1;j<=n;j++) f[dp[ki][j]-dp[ki][kj]-dp[i-1][j]+dp[i-1][kj]]=0; } cout<<ans; return 0; }```