Submission #1239152

#TimeUsernameProblemLanguageResultExecution timeMemory
1239152quannnguyen2009Stranded Far From Home (BOI22_island)C++20
100 / 100
162 ms57672 KiB
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()
using namespace std;

const int N = 2e5+5, mod = 1e9+7, inf = 1e18;

int n, m;
int a[N];
ii b[N];
bool ans[N];
vector<int> adj[N];

struct DSU {
    int par[N], sz[N], sum[N];
    vector<int> lst[N];
    void init(int n) {
        iota(par, par+n+1, 0);
        fill(sz, sz+n+1, 1);
        for (int i=1; i<=n; i++) sum[i] = a[i];
        for (int i=1; i<=n; i++) lst[i].pb(i);
    }
    int find(int u) {
        if (par[u] == u) return u;
        return par[u] = find(par[u]);
    }
    bool join(int u, int v) {
        u = find(u); v = find(v);
        if(u == v) return 0;
        if(sz[u]<sz[v]) swap(u, v);
        par[v] = u; sz[u] += sz[v];
        sum[u] += sum[v];
        for (int it: lst[v]) lst[u].pb(it);
        return 1;
    }     
    int csz(int u) {return sz[find(u)];}
    bool check(int u, int v) {
        return find(u)==find(v);
    }
} DSU;

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
        b[i] = {a[i], i};
    }
    DSU.init(n);
    for (int i=1; i<=m; i++) {
        int u, v; cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    for (int i=1; i<=n; i++) ans[i] = 1;
    sort(b+1, b+n+1);
    for (int i=1; i<=n; i++) {
        set<int> st;
        for (int v: adj[b[i].se]) {
            if (a[v]<b[i].fi || (a[v]==b[i].fi && b[i].se>v)) st.insert(DSU.find(v));
        }
        for (int it: st) {
            if (DSU.sum[it]<b[i].fi) {
                for (int it_: DSU.lst[it])  ans[it_] = 0;
            }
        }
        for (int it: st) DSU.join(b[i].se, it);
    }
    for (int i=1; 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...