Submission #654355

#TimeUsernameProblemLanguageResultExecution timeMemory
654355AlperenTStranded Far From Home (BOI22_island)C++17
100 / 100
234 ms35640 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; int n, m, cnt[N]; struct DSU{ int par[N]; long long sum[N]; vector<int> nodes[N]; DSU(){ for(int i = 1; i < N; i++){ par[i] = i; nodes[i] = {i}; } } int setfind(int a){ if(par[a] == a) return a; else return par[a] = setfind(par[a]); } void setunion(int a, int b){ a = setfind(a), b = setfind(b); if(a != b){ if(nodes[b].size() > nodes[a].size()) swap(a, b); par[b] = par[a]; sum[a] += sum[b]; for(auto x : nodes[b]) nodes[a].push_back(x); nodes[b].clear(); } } }; DSU dsu; pair<int, int> arr[N]; vector<int> graph[N]; int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> cnt[i]; arr[i] = {cnt[i], i}; dsu.sum[i] = cnt[i]; } sort(arr + 1, arr + n + 1); for(int i = 0; i < m; i++){ int a, b; cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); } for(int i = 1; i <= n; i++){ int v = arr[i].second; for(auto e : graph[v]){ if(cnt[e] <= cnt[v] && dsu.setfind(v) != dsu.setfind(e)){ if(dsu.sum[dsu.setfind(e)] < cnt[v]) dsu.nodes[dsu.setfind(e)].clear(); dsu.setunion(v, e); } } } string ans(n, '0'); for(auto x : dsu.nodes[dsu.setfind(arr[n].second)]) ans[x - 1] = '1'; cout << ans; }
#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...