제출 #884656

#제출 시각아이디문제언어결과실행 시간메모리
884656TAhmed33Stranded Far From Home (BOI22_island)C++98
100 / 100
865 ms54596 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 25;
bool ok[MAXN];
set <int> pp;
int cnt[MAXN];
vector <pair <int, int>> edges;
int par[MAXN], sum[MAXN];
set <int> comp[MAXN];
set <pair <int, int>> valid;
void init () {
    for (int i = 1; i < MAXN; i++) {
        par[i] = i;
        ok[i] = 1;
        sum[i] = cnt[i];
        comp[i].insert(i);
        valid.insert({sum[i], i});
    }
}
int find (int x) {
    return par[x] == x ? x : par[x] = find(par[x]);
}
void merge (int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if ((int)comp[x].size() > (int)comp[y].size()) swap(x, y);
    valid.erase({sum[x], x});
    valid.erase({sum[y], y});
    par[x] = y; sum[y] += sum[x];
    valid.insert({sum[y], y});
    for (auto i : comp[x]) comp[y].insert(i);
    comp[x].clear();
}
signed main () {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> cnt[i];
        pp.insert(cnt[i]);
    }
    for (int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        edges.push_back({a, b});
    }
    int z = pp.size();
    sort(edges.begin(), edges.end(), [&] (pair <int, int> &a, pair <int, int> &b) {
        return max(cnt[a.first], cnt[a.second]) > max(cnt[b.first], cnt[b.second]);
    });
    init();
    for (int l = 0; l + 1 < z; l++) {
        auto i = *(pp.begin()); pp.erase(i); 
        while (!edges.empty() && max(cnt[edges.back().first], cnt[edges.back().second]) == i) {
            merge(edges.back().first, edges.back().second);
            edges.pop_back();
        }
        auto y = *(pp.begin());
        while (!valid.empty()) {
            auto k = *(valid.begin());
            if (k.first >= y) break;
            valid.erase(k);
            for (auto j : comp[k.second]) {
                ok[j] = 0;
            }
            comp[k.second].clear();
        }
    }   
    for (int i = 1; i <= n; i++) cout << ok[i];
    cout << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...