Submission #625273

#TimeUsernameProblemLanguageResultExecution timeMemory
625273Ooops_sorryStranded Far From Home (BOI22_island)C++14
100 / 100
492 ms77956 KiB
#include<bits/stdc++.h>

using namespace std;

mt19937 rnd(51);

#define ll long long
#define pb push_back
#define ld long double

const int N = 2e5 + 10;
ll sum[N];
int par[N];
vector<int> g[N];
set<int> st[N];

int find_set(int v) {
    if (v == par[v]) {
        return v;
    } else {
        return par[v] = find_set(par[v]);
    }
}

void union_set(int a, int b) {
    a = find_set(a);
    b = find_set(b);
    if (st[a].size() < st[b].size()) {
        swap(a, b);
    }
    for (auto to : st[b]) {
        st[a].insert(to);
    }
    par[b] = a;
    sum[a] += sum[b];
}

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
#endif // LOCAL
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    for (int i = 0; i < N; i++) {
        par[i] = i;
        st[i].insert(i);
    }
    int n, m;
    cin >> n >> m;
    vector<int> s(n), good(n, 1);
    for (int i = 0; i < n; i++) {
        cin >> s[i];
        sum[i] = s[i];
    }
    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        a--, b--;
        g[a].pb(b);
        g[b].pb(a);
    }
    vector<int> ord(n);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](int i, int j){return s[i] < s[j];});
    for (auto v : ord) {
        set<int> vert;
        for (auto to : g[v]) {
            if (s[to] <= s[v] && find_set(to) != find_set(v)) {
                vert.insert(find_set(to));
            }
        }
        for (auto to : vert) {
            if (sum[to] < s[v]) {
                for (auto u : st[to]) {
                    good[u] = 0;
                }
                st[to].clear();
            }
            union_set(to, v);
        }
    }
    for (int i = 0; i < n; i++) {
        cout << good[i];
    }
    cout << endl;
    return 0;
}
#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...