Description
Input
Output
答案,最大的面积
Sample Input
3 2
4 0
-10 8
-2 -2
Sample Output
4
Solution
先求出二维前缀和
然后考虑枚举
先枚举上边界,左边界,右边界,那么下边界的取值范围是满足二分性的,预处理好大小,二分就行了
Code
#include<cstdio>
#include<algorithm>
#define N 210
#define ll long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
ll s[N][N],f[N][N][N];
int main()
{
freopen("max.in","r",stdin);freopen("max.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
fo(i,1,n)
{
fo(j,1,m)
{
ll x;scanf("%lld",&x);
s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+x;
fo(k,0,i-1) f[i][j][k]=min(f[i][j-1][k],s[i][j]-s[k][j]);
}
}
ll ans=0;
fo(i,1,n) fo(j,1,m)
fo(k,0,i-1)
{
int l=0,r=j;
for(;l+1<r;)
{
int mid=(l+r)/2;
if(s[k][j]+f[i][mid][k]<=s[i][j]) r=mid;else l=mid;
}
if(s[k][j]+f[i][l][k]<=s[i][j]) r=l;
ans=max(ans,(ll)((i-k)*(j-r)));
}
printf("%d",ans);
fclose(stdin);fclose(stdout);
}