Submission #1295622

#TimeUsernameProblemLanguageResultExecution timeMemory
1295622ciao_gioStranded Far From Home (BOI22_island)C++20
0 / 100
226 ms18416 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct DSU { int n; vector<int> l, d; vector<ll> s; vector<bool> m; DSU(int _n, vector<ll> _s) : n(_n), l(n), d(n, 1), s(_s), m(n, false) { iota(begin(l), end(l), 0); } int find(int v) { if (l[v] == v) return v; l[v] = find(l[v]); m[v] = m[v] || m[l[v]]; return l[v]; } void merge(int v, int u) { v = find(v); u = find(u); if (u == v) return; l[v] = u; d[u] += d[v]; s[u] += s[v]; } }; int main() { int N, M; cin >> N >> M; vector<ll> S(N); for (int i = 0; i < N; i++) { cin >> S[i]; } vector<vector<int>> adj(N); for (int i = 0, x, y; i < M; i++) { cin >> x >> y; x--; y--; adj[x].push_back(y); adj[y].push_back(x); } vector<int> idx(N); iota(begin(idx), end(idx), 0); sort(begin(idx), end(idx), [&] (int i, int j) { return S[i] < S[j]; }); DSU dsu(N, S); vector<bool> add(N, false); for (int i = 0; i < N; i++) { int v = idx[i]; add[v] = true; for (int u: adj[v]) { if (!add[u]) continue; if (S[u] < S[v]) { int p = dsu.find(u); if (dsu.s[p] < S[v]) dsu.m[p] = true; } dsu.merge(u, v); } } for (int i = 0; i < N; i++) { dsu.find(i); cout << !dsu.m[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...