제출 #1337882

#제출 시각아이디문제언어결과실행 시간메모리
1337882DangKhoizzzzStranded Far From Home (BOI22_island)C++20
100 / 100
138 ms32484 KiB
// GMAI's code

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 200005;
int s[MAXN], parent_node[MAXN], ans[MAXN];
long long sum[MAXN];
vector<int> adj[MAXN], graph[MAXN];
bool visited[MAXN];

int find_set(int v) {
    return v == parent_node[v] ? v : parent_node[v] = find_set(parent_node[v]);
}

void dfs(int u) {
    ans[u] = 1;
    for (int v : adj[u]) {
        if (!ans[v]) dfs(v);
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n, m;
    cin >> n >> m;

    vector<pair<int, int>> ord(n);
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
        ord[i - 1] = {s[i], i};
        parent_node[i] = i;
        sum[i] = s[i];
    }

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

    sort(ord.begin(), ord.end());

    for (auto p : ord) {
        int u = p.second;
        visited[u] = true;
        for (int v : graph[u]) {
            if (visited[v]) {
                int root_v = find_set(v), root_u = find_set(u); 
                if (root_u != root_v) {
                    if (sum[root_v] >= s[u]) adj[u].push_back(root_v);
                    sum[root_u] += sum[root_v];
                    parent_node[root_v] = root_u;
                }
            }
        }
    }

    dfs(ord.back().second);
    for (int i = 1; i <= n; i++) cout << ans[i];
    
    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...