제출 #655753

#제출 시각아이디문제언어결과실행 시간메모리
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...