Submission #831262

# Submission time Handle Problem Language Result Execution time Memory
831262 2023-08-20T03:07:13 Z vjudge1 Bomb (IZhO17_bomb) C++17
100 / 100
312 ms 55992 KB
// 赤コーダーになりたい
// お願い いいですか?

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

// Pragmas
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

// Namespaces
using namespace std;
using namespace __gnu_pbds;

// Data types
using si	= short int;
using ll	= long long;
using lll	= __int128;
using ld	= long double;

// Pairs
using pii	= pair<int, int>;
using psi	= pair<si, si>;
using pll	= pair<ll, ll>;
using plll	= pair<lll, lll>;
using pld	= pair<ld, ld>;
#define fi	first
#define se	second

// For
#define Frue(i, n, N)		for (int i = (n); i <= (N); i++)
#define  Fru(i, n, N)		for (int i = (n); i <  (N); i++)
#define Frde(i, n, N)		for (int i = (n); i >= (N); i--)
#define  Frd(i, n, N)		for (int i = (n); i >  (N); i--)

// PBDS
template<typename Z>
using ordered_set	= tree<Z, null_type, less<Z>, rb_tree_tag, tree_order_statistics_node_update>;

// Various outputs
template<typename Y, typename Z> ostream& operator<<(ostream &os, const pair<Y, Z> &p) {
	return os << '(' << p.fi << ',' << p.se << ')';
}
template<typename Z> ostream& operator<<(ostream &os, const vector<Z> &v) {
	os << '{'; bool _first = 1;
	for (auto &i : v) {if (!_first) os << ", "; os << i; _first = 0;}
	return os << '}';
}
template<typename Z, unsigned long long sz> ostream& operator<<(ostream &os, const array<Z, sz> &arr) {
	os << '{'; bool _first = 1;
	for (auto &i : arr) {if (!_first) os << ", "; os << i; _first = 0;}
	return os << '}';
}

// Quick macro functions
#define sqr(x)			((x)*(x))
#define debug(x)		cout << #x << " = " << (x) << '\n'
#define debugV(v, x)	cout << #v << "[" << (x) << "] = " << (v[x]) << '\n'
#define rrebug(x)		cerr << #x << " = " << (x) << '\n'
#define rrebugV(v, x)	cerr << #v << "[" << (x) << "] = " << (v[x]) << '\n'

#define All(x)			x.begin(), x.end()
#define Sort(x)			sort(All(x))
#define Reverse(x)		reverse(All(x))
#define Uniqueify(x)	Sort(x); x.erase(unique(All(x)), x.end())

#define RandomSeed			chrono::steady_clock::now().time_since_epoch().count()
#define MultipleTestcases	int _tc; cin >> _tc; for (int _cur_tc = 1; _cur_tc <= _tc; _cur_tc++)

// Check min and max
template<typename Z> void chmin(Z &a, Z b) {a = min(a, b);}
template<typename Z> void chmax(Z &a, Z b) {a = max(a, b);}
 
// Modular arithmetic
template<int MOD>
class ModInt {
  public:
	int v;
	ModInt() : v(0) {}
	ModInt(long long _v) {
		v = int((-MOD < _v && _v < MOD) ? (_v) : (_v % MOD));
		if (v < 0) v += MOD;
	}
 
	friend bool operator==(const ModInt &a, const ModInt &b) {return a.v == b.v;}
	friend bool operator!=(const ModInt &a, const ModInt &b) {return a.v != b.v;}
	friend bool operator< (const ModInt &a, const ModInt &b) {return a.v <  b.v;}
	friend bool operator<=(const ModInt &a, const ModInt &b) {return a.v <= b.v;}
	friend bool operator> (const ModInt &a, const ModInt &b) {return a.v >  b.v;}
	friend bool operator>=(const ModInt &a, const ModInt &b) {return a.v >= b.v;}
 
	ModInt &operator+=(const ModInt &a) {if ((v += a.v) >= MOD) v -= MOD; return *this;}
	ModInt &operator-=(const ModInt &a) {if ((v -= a.v) < 0) v += MOD; return *this;}
	ModInt &operator*=(const ModInt &a) {v = 1ll * v * a.v % MOD; return *this;}
	ModInt &operator/=(const ModInt &a) {return (*this) *= inverse(a);}
 
	friend ModInt pow(ModInt a, long long x) {
		ModInt res = 1;
		for (; x; x /= 2, a *= a) if (x & 1) res *= a;
		return res;
	}
	friend ModInt inverse(ModInt a) {return pow(a, MOD - 2);}
 
	ModInt operator+ () const {return ModInt( v);}
	ModInt operator- () const {return ModInt(-v);}
	ModInt operator++() const {return *this += 1;}
	ModInt operator--() const {return *this -= 1;}
 
	friend ModInt operator+(ModInt a, const ModInt &b) {return a += b;}
	friend ModInt operator-(ModInt a, const ModInt &b) {return a -= b;}
	friend ModInt operator*(ModInt a, const ModInt &b) {return a *= b;}
	friend ModInt operator/(ModInt a, const ModInt &b) {return a /= b;}
 
	friend istream &operator>>(istream &is, ModInt &v) {return is >> v.v;}
	friend ostream &operator<<(ostream &os, const ModInt &v) {return os << v.v;}
};
const int ModA	= 998244353;
const int ModC	= 1e9 + 7;
using MintA	= ModInt<ModA>;
using MintC	= ModInt<ModC>;

// Other constants
const ll INF	= 1e18;
const ll iINF	= 1e9;
const ld EPS	= 1e-9;
const ld iEPS	= 1e-6;

const int maxN	= 2523;

int N, M;
char grid[maxN][maxN];
int up[maxN][maxN], dn[maxN][maxN], minH[maxN];
int boundH = iINF, boundW = iINF, ans = 0;

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	cin >> N >> M;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			cin >> grid[i][j];
		}
	}

	// Precompute up, dn, and boundH
	for (int j = 1; j <= M; j++) {
		for (int i = 1; i <= N; i++) {
			if (grid[i][j] == '0') {
				up[i][j] = 0;
			} else {
				up[i][j] = up[i-1][j] + 1;
				if ((i == N) || (grid[i+1][j] == '0')) {
					boundH = min(boundH, up[i][j]);
				}
			}
		}

		for (int i = N; i >= 1; i--) {
			if (grid[i][j] == '0') {
				dn[i][j] = 0;
			} else {
				dn[i][j] = dn[i+1][j] + 1;
			}
		}
	}

	// Precompute boundW
	for (int i = 1; i <= N; i++) {
		int span = 0;
		for (int j = 1; j <= M; j++) {
			if (grid[i][j] == '0') {
				span = 0;
			} else {
				span += 1;
				if ((j == M) || (grid[i][j+1] == '0')) {
					boundW = min(boundW, span);
				}
			}
		}
	}

	// Compute minH for each horizontal prefix and suffix
	for (int j = 1; j <= M; j++) {
		minH[j] = boundH;
	}
	for (int i = 1; i <= N; i++) {
		int span = 0, mnUp = iINF, mnDn = iINF;
		for (int j = 1; j <= M; j++) {
			if (grid[i][j] == '0') {
				span = 0, mnUp = iINF, mnDn = iINF;
			} else {
				span += 1;
				mnUp = min(mnUp, up[i][j]);
				mnDn = min(mnDn, dn[i][j]);

				minH[span] = min(minH[span], mnUp + mnDn - 1);
			}
		}
		
		span = 0, mnUp = iINF, mnDn = iINF;
		for (int j = M; j >= 1; j--) {
			if (grid[i][j] == '0') {
				span = 0, mnUp = iINF, mnDn = iINF;
			} else {
				span += 1;
				mnUp = min(mnUp, up[i][j]);
				mnDn = min(mnDn, dn[i][j]);

				minH[span] = min(minH[span], mnUp + mnDn - 1);
			}
		}
	}

	for (int j = 1; j <= boundW; j++) {
		ans = max(ans, minH[j] * j);
	}

	cout << ans << '\n';
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 468 KB Output is correct
3 Correct 9 ms 26580 KB Output is correct
4 Correct 9 ms 26496 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 0 ms 340 KB Output is correct
8 Correct 0 ms 468 KB Output is correct
9 Correct 0 ms 468 KB Output is correct
10 Correct 1 ms 468 KB Output is correct
11 Correct 1 ms 468 KB Output is correct
12 Correct 0 ms 468 KB Output is correct
13 Correct 1 ms 404 KB Output is correct
14 Correct 1 ms 468 KB Output is correct
15 Correct 0 ms 468 KB Output is correct
16 Correct 0 ms 468 KB Output is correct
17 Correct 1 ms 980 KB Output is correct
18 Correct 1 ms 980 KB Output is correct
19 Correct 1 ms 1364 KB Output is correct
20 Correct 1 ms 1236 KB Output is correct
21 Correct 1 ms 852 KB Output is correct
22 Correct 1 ms 1108 KB Output is correct
23 Correct 1 ms 1364 KB Output is correct
24 Correct 1 ms 1236 KB Output is correct
25 Correct 1 ms 1364 KB Output is correct
26 Correct 1 ms 1364 KB Output is correct
27 Correct 3 ms 3924 KB Output is correct
28 Correct 5 ms 4180 KB Output is correct
29 Correct 5 ms 5332 KB Output is correct
30 Correct 5 ms 6228 KB Output is correct
31 Correct 4 ms 4948 KB Output is correct
32 Correct 4 ms 5716 KB Output is correct
33 Correct 5 ms 6612 KB Output is correct
34 Correct 3 ms 4692 KB Output is correct
35 Correct 5 ms 6556 KB Output is correct
36 Correct 6 ms 6612 KB Output is correct
37 Correct 1 ms 468 KB Output is correct
38 Correct 238 ms 55964 KB Output is correct
39 Correct 0 ms 468 KB Output is correct
40 Correct 23 ms 15448 KB Output is correct
41 Correct 0 ms 468 KB Output is correct
42 Correct 1 ms 1364 KB Output is correct
43 Correct 226 ms 55756 KB Output is correct
44 Correct 6 ms 6612 KB Output is correct
45 Correct 256 ms 55860 KB Output is correct
46 Correct 233 ms 55852 KB Output is correct
47 Correct 232 ms 55768 KB Output is correct
48 Correct 273 ms 55876 KB Output is correct
49 Correct 234 ms 55864 KB Output is correct
50 Correct 234 ms 55900 KB Output is correct
51 Correct 259 ms 55828 KB Output is correct
52 Correct 237 ms 55868 KB Output is correct
53 Correct 240 ms 55756 KB Output is correct
54 Correct 231 ms 55772 KB Output is correct
55 Correct 232 ms 55808 KB Output is correct
56 Correct 240 ms 55992 KB Output is correct
57 Correct 240 ms 55960 KB Output is correct
58 Correct 242 ms 55808 KB Output is correct
59 Correct 223 ms 55864 KB Output is correct
60 Correct 227 ms 55860 KB Output is correct
61 Correct 228 ms 55876 KB Output is correct
62 Correct 234 ms 55780 KB Output is correct
63 Correct 270 ms 55860 KB Output is correct
64 Correct 305 ms 55872 KB Output is correct
65 Correct 234 ms 55860 KB Output is correct
66 Correct 250 ms 55860 KB Output is correct
67 Correct 234 ms 55760 KB Output is correct
68 Correct 236 ms 55864 KB Output is correct
69 Correct 218 ms 55860 KB Output is correct
70 Correct 140 ms 44752 KB Output is correct
71 Correct 222 ms 55840 KB Output is correct
72 Correct 214 ms 55976 KB Output is correct
73 Correct 265 ms 55848 KB Output is correct
74 Correct 229 ms 55860 KB Output is correct
75 Correct 230 ms 55864 KB Output is correct
76 Correct 252 ms 55828 KB Output is correct
77 Correct 230 ms 55860 KB Output is correct
78 Correct 247 ms 55872 KB Output is correct
79 Correct 219 ms 55776 KB Output is correct
80 Correct 219 ms 55860 KB Output is correct
81 Correct 208 ms 55760 KB Output is correct
82 Correct 223 ms 55820 KB Output is correct
83 Correct 225 ms 55956 KB Output is correct
84 Correct 214 ms 55876 KB Output is correct
85 Correct 238 ms 55864 KB Output is correct
86 Correct 239 ms 55860 KB Output is correct
87 Correct 235 ms 55868 KB Output is correct
88 Correct 280 ms 55760 KB Output is correct
89 Correct 230 ms 55864 KB Output is correct
90 Correct 147 ms 44648 KB Output is correct
91 Correct 242 ms 55756 KB Output is correct
92 Correct 231 ms 55752 KB Output is correct
93 Correct 241 ms 55824 KB Output is correct
94 Correct 233 ms 55856 KB Output is correct
95 Correct 312 ms 55864 KB Output is correct
96 Correct 272 ms 55864 KB Output is correct
97 Correct 241 ms 55788 KB Output is correct
98 Correct 230 ms 55852 KB Output is correct
99 Correct 216 ms 55872 KB Output is correct
100 Correct 228 ms 55864 KB Output is correct