Submission #722915

#TimeUsernameProblemLanguageResultExecution timeMemory
722915sunnatStranded Far From Home (BOI22_island)C++14
100 / 100
417 ms47176 KiB
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <set>
using namespace std;
#define int long long
int n;
vector<int> val, sid, id, root, solution;

vector<vector<int> > graph;
vector<vector<int> > tree;

int dsu(int u){
    return root[u] == u ? u : root[u] = dsu(root[u]);
}
void clear_sub_tree(int u){
    if(solution[u] == 0) return;
    solution[u] = 0;
    for(int v:tree[u]) clear_sub_tree(v);
}
void dfs(int u){
    int vl = val[u];
    // cout << "-->" << u << endl;
    for(int v:tree[u]){
        dfs(v);
        val[u] += val[v];
        if(val[v] < vl) clear_sub_tree(v);
    }
    // cout << "<--" << u << endl;
}

signed main(){
    int m;
    cin >> n >> m;
    val.resize(n);
    graph.resize(n);
    tree.resize(n);
    sid.resize(n);
    id.resize(n);
    solution.resize(n, 1);
    
    for(int i = 0; i < n; i ++){
        cin >> val[i];
        sid[i] = i;
    }
    root = sid;
    sort(sid.begin(), sid.end(), [&](int r, int l){return val[r] < val[l];});
    for(int i = 0; i < n; i ++)
        id[sid[i]] = i;

    for(int i = 0, u, v; i < m; i ++){
        cin >> u >> v;
        --u;
        --v;
        if(id[u] > id[v]) swap(u, v);
        graph[v].push_back(u);
    }

    for(int u:sid){
        for(int v:graph[u]){
            if(dsu(u) != dsu(v)){
                tree[u].push_back(dsu(v));
                root[dsu(v)] = u;
            }
        }
    }
    dfs(sid.back());
    for(int x:solution) cout << x;
    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...