Submission #1305427

#TimeUsernameProblemLanguageResultExecution timeMemory
1305427snasibov05Stranded Far From Home (BOI22_island)C++20
100 / 100
267 ms52340 KiB
#include <bits/stdc++.h> using namespace std; #define int long long 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; } }; signed 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...