Submission #1305426

#TimeUsernameProblemLanguageResultExecution timeMemory
1305426snasibov05Stranded Far From Home (BOI22_island)C++20
0 / 100
1097 ms33892 KiB
#include <bits/stdc++.h>

using namespace std;

struct DSU{
    vector<int> pr;
    vector<int> sz;
    vector<int> sum;
    vector<vector<int>> members;
    vector<bool> possible;

    DSU(int n, vector<array<int, 2>>& s){
       pr.resize(n+1);
       sz.resize(n+1);
       sum.resize(n+1);
       members.resize(n+1);
       possible.resize(n+1);

       for (int i = 1; i <= n; ++i){
           pr[i] = i;
           sz[i] = 1;
           sum[i] = s[i][0];
           members[i].push_back(i);
           possible[i] = true;
       }
    }

    // u is the node with next greater weight
    void Union(int u, int v, int val_u){
        int cu = pr[u], cv = pr[v];

        if (cu == cv) return;

        if (sum[cv] < val_u){
            // cv component ties cannot be preferred
            for (auto node : members[cv])
                possible[node] = false;
        }

        if (sz[cu] > sz[cv]) swap(cu, cv);

        sum[cv] += sum[cu];
        sz[cv] += sz[cu];
        for (auto node : members[cu]){
            pr[node] = cv;
            members[cv].push_back(node);
        }
    }

    string get_answer(){
        string ans;
        for (int i = 1; i < possible.size(); ++i){
            if (possible[i]) ans += '1';
            else ans += '0';
        }
        return ans;
    }
};

int main() {

    int n, m; cin >> n >> m;
    vector<array<int, 2>> s(n+1); s[0][0] = INT32_MIN;
    for (int i = 1; i <= n; ++i) {
        cin >> s[i][0];
        s[i][1] = i;
    }
    vector<vector<int>> ed(n+1);
    for (int i = 0; i < m; ++i){
        int u, v; cin >> u >> v;
        ed[u].push_back(v);
        ed[v].push_back(u);
    }

    DSU dsu(n, s);

    sort(s.begin(), s.end());
    vector<bool> in(n+1);
    for (int i = 1; i <= n; ++i){
        in[s[i][1]] = true;
        for (auto to : ed[s[i][1]]){
            if (!in[to]) continue;
            dsu.Union(s[i][1], to, s[i][0]);
        }
    }

    cout << dsu.get_answer() << "\n";


    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...