Submission #984243

#TimeUsernameProblemLanguageResultExecution timeMemory
984243OAleksaStranded Far From Home (BOI22_island)C++14
0 / 100
119 ms59328 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); } vector<tuple<int, int, int>> edges; for (int i = 1;i <= m;i++) { int x, y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); int c = max(a[x], a[y]); edges.push_back({c, x, y}); } sort(edges.begin(), edges.end()); for (auto u : edges) { int a, b, c; tie(c, a, b) = u; int x = root(a); int y = root(b); assert(sum[x] >= c || sum[y] >= c); if (x != y) { if (sum[x] >= c && sum[y] >= c) { if (sz[x] < sz[y]) swap(x, y); for (auto j : can[y]) can[x].push_back(j); p[y] = x; sz[x] += sz[y]; sum[x] += sum[y]; } else if (sum[x] >= c) { p[y] = x; sum[x] += sum[y]; sz[x] += sz[y]; } else { //assert(sum[y] >= c); p[x] = y; sum[y] += sum[x]; sz[y] += sz[x]; } } } // 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...