Submission #984183

#TimeUsernameProblemLanguageResultExecution timeMemory
984183OAleksaStranded Far From Home (BOI22_island)C++14
0 / 100
112 ms56148 KiB
#include <bits/stdc++.h> #define f first #define s second using namespace std; const int N = 2e5 + 69; int n, m, a[N], p[N], sz[N], sum[N], vis[N], ans[N]; vector<int> g[N], can[N]; int root(int v) { if (p[v] == v) return v; return p[v] = root(p[v]); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt = 1; //cin >> tt; while (tt--) { cin >> n >> m; for (int i = 1;i <= n;i++) { cin >> a[i]; p[i] = i, sz[i] = 1; sum[i] = a[i]; can[i].push_back(i); } for (int i = 1;i <= m;i++) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } vector<int> ord(n); iota(ord.begin(), ord.end(), 1); sort(ord.begin(), ord.end(), [&](int i, int j) { return a[i] < a[j]; }); for (int j = 0;j < n;j++) { int i = ord[j]; vis[i] = 1; for (auto u : g[i]) { if (vis[u]) { int x = root(u); int y = root(i); int ok = 0; if (x != y) { if (sum[x] >= a[i]) ok = 1; if (sz[x] < sz[y]) { assert(!ok); swap(x, y); } else swap(can[y], can[x]); p[y] = x; sz[x] += sz[y]; sum[x] += sum[y]; if (ok) { for (auto t : can[y]) can[x].push_back(t); } } } } } int ok = 1; for (int i = 2;i <= n;i++) ok &= (root(i) == root(i - 1)); assert(ok); for (auto j : can[root(1)]) ans[j] = 1; for (int i = 1;i <= n;i++) cout << ans[i]; cout << '\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...