Submission #1230797

#TimeUsernameProblemLanguageResultExecution timeMemory
1230797MatthewwwwBomb (IZhO17_bomb)C++17
41 / 100
1098 ms74152 KiB
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#ifdef LOCAL
#define err cerr
#else
#define err if (0) cerr
#endif

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, m;
	cin >> n >> m;
	vector<vector<int>> grid;
	if (n < m) {
		grid.resize(n, vector<int>(m));	
		for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) {
			char c;
			cin >> c;
			grid[i][j] = c == '0';
		}
	} else {
		grid.resize(m, vector<int>(n));
		for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) {
			char c;
			cin >> c;
			grid[j][i] = c == '0';
		}
		swap(n, m);
	}
	vector<vector<int>> psum(n+1, vector<int>(m+1, 0));
	for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) psum[i+1][j+1] = grid[i][j];
	for (int i = 0; i < n; i++) for (int j = 0; j <= m; j++) psum[i+1][j] += psum[i][j];
	for (int i = 0; i <= n; i++) for (int j = 0; j < m; j++) psum[i][j+1] += psum[i][j];
	int mx = n, my = m;
	for (int i = 0; i < n; i++) {
		vector<pair<int, int>> ran;
		for (int j = 0; j < m; j++) {
			if (grid[i][j]) continue;
			if (!ran.size() || ran.back().s != j)
				ran.push_back({j, j+1});
			else
				ran.back().s++;
		}
		for (auto j: ran) my = min(my, j.s-j.f);
	}
	for (int i = 0; i < m; i++) {
		vector<pair<int, int>> ran;
		for (int j = 0; j < n; j++) {
			if (grid[j][i]) continue;
			if (!ran.size() || ran.back().s != j)
				ran.push_back({j, j+1});
			else
				ran.back().s++;
		}
		for (auto j: ran) mx = min(mx, j.s-j.f);
	}
	int upt = 32-__builtin_clz(my);
	// proof by ac doesn't work :(
	if (1) {
		int ans = 0;
		for (int x = 1; x <= mx; x++) {
			int y = 0;
			for (int l = upt; l--;) {
				int k = y+(1<<l);
				vector<vector<int>> psa(n+1, vector<int>(m+1, 0));
				for (int i = 0; i <= n-x; i++) {
					for (int j = 0; j <= m-k; j++) {
						if (psum[i+x][j+k]-psum[i+x][j]-psum[i][j+k]+psum[i][j] == 0) {
							psa[i+x][j+k]++;
							psa[i+x][j]--;
							psa[i][j+k]--;
							psa[i][j]++;
						}
					}
				}
				for (int i = 0; i < n; i++) for (int j = 0; j <= m; j++) psa[i+1][j] += psa[i][j];
				for (int i = 0; i <= n; i++) for (int j = 0; j < m; j++) psa[i][j+1] += psa[i][j];
				bool good = true;
				for (int i = 0; i < n && good; i++) for (int j = 0; j < m && good; j++) good = (!psa[i][j]) == grid[i][j];
				if (good) y += 1<<l;
			}
			ans = max(ans, x*y);
			err << x << " " << y << "\n";
		}
		cout << ans << "\n";
		return 0;
	}
	cout << mx*my << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...