Submission #968698

#TimeUsernameProblemLanguageResultExecution timeMemory
968698vladiliusStranded Far From Home (BOI22_island)C++17
100 / 100
195 ms42188 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;

struct dsu{
    vector<int> p, sz;
    vector<bool> out;
    vector<vector<int>> all;
    vector<ll> s;
    int n;
    dsu(int ns, vector<int>& x){
        n = ns;
        p.resize(n + 1);
        sz.resize(n + 1);
        s.resize(n + 1);
        out.assign(n + 1, 1);
        all.resize(n + 1);
        for (int i = 1; i <= n; i++){
            p[i] = i;
            sz[i] = 1;
            s[i] = x[i];
            all[i] = {i};
        }
    }
    int get(int v){
        if (p[v] != v){
            p[v] = get(p[v]);
        }
        return p[v];
    }
    void unite(int x, int y, int val){
        x = get(x); y = get(y);
        if (x == y) return;
        if (s[x] < val){
            for (int i: all[x]){
                out[i] = 0;
            }
        }
        if (sz[x] > sz[y]){
            swap(x, y);
        }
        p[x] = y;
        sz[y] += sz[x];
        for (int i: all[x]) all[y].push_back(i);
        s[y] += s[x];
    }
};

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n, m; cin>>n>>m;
    vector<int> x(n + 1), p = {0};
    for (int i = 1; i <= n; i++){
        cin>>x[i];
        p.push_back(i);
    }
    auto cmp = [&](int i, int j){
        return x[i] < x[j];
    };
    sort(p.begin(), p.end(), cmp);
    
    vector<int> g[n + 1];
    while (m--){
        int a, b; cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    
    int i = 1;
    dsu T(n, x);
    while (i <= n){
        int j = i;
        while (j <= n && x[p[i]] == x[p[j]]){
            j++;
        }
        for (int k = i; k < j; k++){
            int v = p[k];
            for (int u: g[v]){
                if (x[u] <= x[v]){
                    T.unite(u, v, x[v]);
                }
            }
        }
        i = j;
    }
    
    for (int i = 1; i <= n; i++){
        cout<<T.out[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...