Submission #655753

#TimeUsernameProblemLanguageResultExecution timeMemory
655753someoneBomb (IZhO17_bomb)C++14
0 / 100
72 ms131072 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 2.5e3 + 42, INF = 1e18 + 42; bool alien[N*N]; vector<int> add[N*N]; int n, m, t[N*N], id[N][N], sz[N*N]; int F(int i) { if(sz[i] < 0) return i; return sz[i] = F(sz[i]); } 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& p : sz) p = -1; cin >> n >> m; n++, m++; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) id[i][j] = m * i + j; for(int i = 1; i < n; i++) for(int j = 1; j < m; j++) { char c; c = '1';//cin >> c; alien[id[i][j]] = (c == '1'); } int minLen = INF; for(int i = 1; i < n; i++) for(int j = 1; j < m; j++) if(alien[id[i][j]]) { t[id[i][j]] = t[id[i][j]-1] + 1; add[t[id[i][j]]].push_back(id[i][j]); if(j == m || !alien[id[i][j]+1]) minLen = min(minLen, t[id[i][j]]); } int ans = 0; multiset<int> len; for(int i = N*N-1; i > 0; i--) { for(int j : add[i]) { if(t[j - m] >= t[j]) { len.erase(len.find(getSz(j - m))); U(j - m, j); } if(t[j + m] > t[j]) { len.erase(len.find(getSz(j + m))); U(j + m, j); } len.insert(getSz(j)); } if(i <= minLen) { auto it = len.begin(); ans = max(ans, (*it) * i); } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...