码农

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;
}```
posted @ 2020-08-07 20:50  zlq,  阅读(117)  评论(1编辑  收藏  举报