Submission #850476

#TimeUsernameProblemLanguageResultExecution timeMemory
850476MinaRagy06Stranded Far From Home (BOI22_island)C++17
100 / 100
625 ms63016 KiB
#include <bits/stdc++.h> using namespace std; typedef int64_t ll; const int N = 200'005; int par[N], sz[N], par2[N], bad[N], a[N]; ll cnt[N]; set<array<int, 3>> adj[N]; pair<int, int> find2(int u) { if (par2[u] == u) { return {u, bad[u]}; } pair<int, int> v = find2(par2[u]); bad[u] |= v.second; par2[u] = v.first; return {par2[u], bad[u]}; } pair<int, int> find(int u) { if (par[u] == u) { return {u, bad[u]}; } pair<int, int> v = find(par[u]); par[u] = v.first; return {par[u], bad[u]}; } void join2(int u, int v) { u = find2(u).first; v = find2(v).first; if (u == v) return; par2[v] = u; } void join(int u, int v) { u = find(u).first, v = find(v).first; if (u == v) return; if (sz[u] < sz[v]) swap(u, v); par[v] = u, sz[u] += sz[v], cnt[u] += cnt[v]; for (auto [vnxt, nxt, src] : adj[v]) { int x = find(nxt).first; if (x != u) { adj[u].insert({a[nxt], nxt, src}); } else { adj[u].erase({a[src], src, nxt}); } } adj[v].clear(); } int main() { ios_base::sync_with_stdio(0), cin.tie(0); int n, m; cin >> n >> m; for (int i = 0; i < n; i++) { par[i] = i, par2[i] = i, sz[i] = 1, bad[i] = 0; cin >> cnt[i]; a[i] = cnt[i]; } for (int i = 0, u, v; i < m; i++) { cin >> u >> v; u--, v--; adj[u].insert({a[v], v, u}); adj[v].insert({a[u], u, v}); } priority_queue<pair<ll, pair<int, int>>> pq; for (int i = 0; i < n; i++) { pq.push({-cnt[i], {i, i}}); } while (pq.size()) { int node = pq.top().second.first; int node2 = pq.top().second.second; ll val = -pq.top().first; pq.pop(); if (node != par[node]) { continue; } if (val != cnt[node]) { continue; } if (sz[node] == n) { continue; } if (adj[node].empty() || val < (*adj[node].begin())[0]) { bad[node2] = 1; continue; } int x = (*adj[node].begin())[1]; join(node, x); int New = find(node).first; join2(node2, x); int New2 = find2(node).first; pq.push({-cnt[New], {New, New2}}); } for (int i = 0; i < n; i++) { cout << !find2(i).second; } cout << '\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...