Submission #625273

#TimeUsernameProblemLanguageResultExecution timeMemory
625273Ooops_sorryStranded Far From Home (BOI22_island)C++14
100 / 100
492 ms77956 KiB
#include<bits/stdc++.h> using namespace std; mt19937 rnd(51); #define ll long long #define pb push_back #define ld long double const int N = 2e5 + 10; ll sum[N]; int par[N]; vector<int> g[N]; set<int> st[N]; int find_set(int v) { if (v == par[v]) { return v; } else { return par[v] = find_set(par[v]); } } void union_set(int a, int b) { a = find_set(a); b = find_set(b); if (st[a].size() < st[b].size()) { swap(a, b); } for (auto to : st[b]) { st[a].insert(to); } par[b] = a; sum[a] += sum[b]; } signed main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif // LOCAL ios_base::sync_with_stdio(0); cin.tie(0); for (int i = 0; i < N; i++) { par[i] = i; st[i].insert(i); } int n, m; cin >> n >> m; vector<int> s(n), good(n, 1); for (int i = 0; i < n; i++) { cin >> s[i]; sum[i] = s[i]; } for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--, b--; g[a].pb(b); g[b].pb(a); } vector<int> ord(n); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int i, int j){return s[i] < s[j];}); for (auto v : ord) { set<int> vert; for (auto to : g[v]) { if (s[to] <= s[v] && find_set(to) != find_set(v)) { vert.insert(find_set(to)); } } for (auto to : vert) { if (sum[to] < s[v]) { for (auto u : st[to]) { good[u] = 0; } st[to].clear(); } union_set(to, v); } } for (int i = 0; i < n; i++) { cout << good[i]; } cout << endl; 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...