Submission #1323103

#TimeUsernameProblemLanguageResultExecution timeMemory
1323103NValchanovStranded Far From Home (BOI22_island)C++20
100 / 100
280 ms38876 KiB
#include <iostream> #include <vector> #include <cassert> #include <algorithm> using namespace std; typedef long long llong; const int MAXN = 2e5 + 10; int n, m; pair < int, int > ord[MAXN]; int c[MAXN]; vector < int > adj[MAXN]; int leader[MAXN]; int sz[MAXN]; llong sum[MAXN]; vector < int > nodes[MAXN]; bool ans[MAXN]; int findLeader(int u) { return leader[u] == u ? u : leader[u] = findLeader(leader[u]); } bool connected(int u, int v) { return findLeader(u) == findLeader(v); } void unite(int u, int v) { if(connected(u, v)) return; u = findLeader(u); v = findLeader(v); if(sz[u] < sz[v]) swap(u, v); sz[u] += sz[v]; leader[v] = u; sum[u] += sum[v]; for(int &node : nodes[v]) { nodes[u].push_back(node); } nodes[v].clear(); } void read() { cin >> n >> m; for(int i = 1; i <= n; i++) { cin >> c[i]; } for(int i = 1; i <= m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } } void solve() { for(int i = 1; i <= n; i++) { ord[i] = {c[i], i}; } for(int i = 1; i <= n; i++) { ans[i] = true; } for(int i = 1; i <= n; i++) { leader[i] = i; sz[i] = 1; sum[i] = c[i]; nodes[i].push_back(i); } sort(ord + 1, ord + n + 1); for(int i = 1; i <= n; i++) { int u = ord[i].second; for(int v : adj[u]) { if(connected(u, v) || sum[findLeader(u)] < c[v]) continue; if(sum[findLeader(v)] < c[u]) { for(int &node : nodes[findLeader(v)]) { ans[node] = false; } } unite(u, v); } } for(int i = 1; i <= n; i++) { cout << ans[i]; } cout << endl; } int main() { read(); solve(); 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...