Submission #1188463

#TimeUsernameProblemLanguageResultExecution timeMemory
1188463qwushaStranded Far From Home (BOI22_island)C++20
100 / 100
223 ms41056 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#define int long long


vector<vector<int>> g;


int n;
vector<int> s;
vector<int> bad;

int nextval;


struct dsu {
    vector<int> sz, par, sum, prev;

    void init() {
        sz.resize(n);
        par.resize(n);
        sum.resize(n);
        for (int i = 0; i < n; i++) {
            sz[i] = 1;
            par[i] = i;
            sum[i] = s[i];
        }
    }
    int get_par(int v) {
        if (par[v] == v)
            return v;
        int ans = get_par(par[v]);
        par[v] = ans;
        return ans;
    }
    void merg(int v, int u) {
        v = get_par(v);
        u = get_par(u);
        if (v == u)
            return;
        sz[v] += sz[u];
        if (sum[u] < nextval) {
            bad.push_back(u);
        }
        if (sum[v] < nextval) {
            bad.push_back(v);
        }
        sum[v] += sum[u];
        par[u] = v;
    }
};


signed main() {
    int m;
    cin >> n >> m;
    s.resize(n);
    vector<pair<int, int>> a;
    for (int i = 0; i < n; i++) {
        cin >> s[i];
        a.push_back({s[i], i});
    }
    sort(a.begin(), a.end());
    g.resize(n);
    vector<vector<int>> edg(n);
    for (int i = 0; i < m; i++) {
        int v, u;
        cin >> v >> u;
        if (s[v - 1] < s[u - 1])
            swap(v, u);
        edg[v - 1].push_back(u - 1);
        g[v - 1].push_back(u - 1);
        g[u - 1].push_back(v - 1);
    }
    dsu dsu;
    dsu.init();
    for (int i = 0; i < n; i++) {
        int v = a[i].se;
        nextval = s[v];
        for (auto u : edg[v]) {
            dsu.merg(v, u);
        }
    }
    reverse(bad.begin(), bad.end());
    vector<int> ans(n, 1);
    set<pair<int, int>> st;
    for (auto i : bad) {
        if (ans[i] == 0)
            continue;
        int cursz = s[i];
        ans[i] = 0;
        for (auto u : g[i]) {
            st.insert({s[u], u});
        }
        while (!st.empty()) {
            auto pa = *st.begin();
            int siz = pa.fi;
            int v = pa.se;
            st.erase(pa);
            if (ans[v] == 0)
                continue;
            if (siz <= cursz) {
                cursz += siz;
                ans[v] = 0;
                for (auto u : g[v]) {
                    if (ans[u] == 1) {
                        st.insert({s[u], u});
                    }
                }
            }
        }
    }
    for (int i = 0; i < n; i++) {
        cout << ans[i];
    }
}
#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...