Submission #341001

#TimeUsernameProblemLanguageResultExecution timeMemory
341001TosicBomb (IZhO17_bomb)C++14
87 / 100
181 ms80244 KiB
#include <bits/stdc++.h>
#define maxn 2510
using namespace std;

int n, m, ans, dp[maxn];
int a[maxn][maxn], up[maxn][maxn], down[maxn][maxn];

int main(){
	ios_base::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
	cin >> n >> m;
	for(int i = 0; i < n; ++i){
		dp[i+1] = 1e9;
		for(int j = 0; j < m; ++j){
			char tmpC;
			cin >>tmpC;
			a[i][j] = tmpC-'0';
		}
	}
	for(int i = 0; i < n; ++i){
		for(int j = 0; j < m; ++j){
			if(a[i][j]){
				up[i][j] = 1;
				if(i){
					up[i][j] += up[i-1][j];
				}
			}
		}
	}
	int tmp=n;
	for(int i = n-1; i >= 0; --i){
		for(int j = 0; j < m; ++j){
			if(a[i][j]){
				down[i][j] = 1 + down[i+1][j];
			}
		}
	}
	for(int i = 0; i < n; ++i){
		for(int j = 0; j < m; ++j){
			if(!a[i][j]){
				continue;
			}
			int frJ = j, ln = 1, maxUp = up[i][j], maxD = down[i][j];
			dp[1] = min(dp[1], maxUp+maxD-1);
			while(a[i][j+1]){
				++j;
				++ln;
				maxUp = min(maxUp, up[i][j]);
				maxD = min(maxD, down[i][j]);
				dp[ln] = min(dp[ln], maxUp+maxD-1);

			}
			maxUp = 1e9, maxD = 1e9;
			ln = 1;
			for(int k = j; k >= frJ; --k){
				maxD = min(maxD, down[i][k]);
				maxUp = min(maxUp, up[i][k]);
				dp[ln] = min(dp[ln], maxUp+maxD-1);
				++ln;
			}
			tmp = min(tmp, abs(frJ-j)+1);
		}
	}
	for(int i = 1; i <= tmp; ++i){
		ans = max(ans, i*dp[i]);
	}
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...