Submission #655817

#TimeUsernameProblemLanguageResultExecution timeMemory
655817someoneBomb (IZhO17_bomb)C++14
30 / 100
1097 ms101908 KiB
#include <bits/stdc++.h> //#define int long long using namespace std; struct Alien { int t, id; }; const int N = 2500 + 42, INF = 1e9 + 42; bool alien[N*N]; vector<Alien> add; int n, m, t[N], sz[N*N]; int F(int i) { if(sz[i] < 0) return i; return sz[i] = F(sz[i]); } inline int getSz(int i) { return -sz[F(i)]; } void U(int a, int b) { a = F(a), b = F(b); if(a == b) return; if(-sz[a] < -sz[b]) swap(a, b); sz[a] += sz[b]; sz[b] = a; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); for(int i = 0; i < N*N; i++) sz[i] = -1; cin >> n >> m; n++, m++; for(int i = 1; i < n; i++) for(int j = 1; j < m; j++) { char c; cin >> c; alien[m * i + j] = (c == '1'); } int minLen = INF; for(int i = 1; i < n; i++) for(int j = 1; j < m; j++) if(alien[m * i + j]) { int id = m * i + j; t[j] = t[j-1] + 1; alien[id] = false; add.push_back({t[j], id}); if(!alien[id+1]) minLen = min(minLen, t[j]); } else { t[j] = 0; } sort(add.begin(), add.end(), [](Alien a, Alien b) { if(a.t == b.t) return a.id < b.id; return a.t > b.t; }); multiset<int> len; int ans = 0, l = (int)add.size(); for(int i = 0; i < l; i++) { int j = add[i].id; alien[j] = true; if(alien[j - m]) { len.erase(len.find(getSz(j - m))); U(j - m, j); } if(alien[j + m]) { len.erase(len.find(getSz(j + m))); U(j + m, j); } len.insert(getSz(j)); if(add[i].t <= minLen && (i == l-1 || add[i+1].t < add[i].t)) { auto it = len.begin(); ans = max(ans, (*it) * add[i].t); } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...