Submission #884656

#TimeUsernameProblemLanguageResultExecution timeMemory
884656TAhmed33Stranded Far From Home (BOI22_island)C++98
100 / 100
865 ms54596 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 2e5 + 25; bool ok[MAXN]; set <int> pp; int cnt[MAXN]; vector <pair <int, int>> edges; int par[MAXN], sum[MAXN]; set <int> comp[MAXN]; set <pair <int, int>> valid; void init () { for (int i = 1; i < MAXN; i++) { par[i] = i; ok[i] = 1; sum[i] = cnt[i]; comp[i].insert(i); valid.insert({sum[i], i}); } } int find (int x) { return par[x] == x ? x : par[x] = find(par[x]); } void merge (int x, int y) { x = find(x); y = find(y); if (x == y) return; if ((int)comp[x].size() > (int)comp[y].size()) swap(x, y); valid.erase({sum[x], x}); valid.erase({sum[y], y}); par[x] = y; sum[y] += sum[x]; valid.insert({sum[y], y}); for (auto i : comp[x]) comp[y].insert(i); comp[x].clear(); } signed main () { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> cnt[i]; pp.insert(cnt[i]); } for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; edges.push_back({a, b}); } int z = pp.size(); sort(edges.begin(), edges.end(), [&] (pair <int, int> &a, pair <int, int> &b) { return max(cnt[a.first], cnt[a.second]) > max(cnt[b.first], cnt[b.second]); }); init(); for (int l = 0; l + 1 < z; l++) { auto i = *(pp.begin()); pp.erase(i); while (!edges.empty() && max(cnt[edges.back().first], cnt[edges.back().second]) == i) { merge(edges.back().first, edges.back().second); edges.pop_back(); } auto y = *(pp.begin()); while (!valid.empty()) { auto k = *(valid.begin()); if (k.first >= y) break; valid.erase(k); for (auto j : comp[k.second]) { ok[j] = 0; } comp[k.second].clear(); } } for (int i = 1; i <= n; i++) cout << ok[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...