Submission #1295652

#TimeUsernameProblemLanguageResultExecution timeMemory
1295652ciao_gioStranded Far From Home (BOI22_island)C++20
0 / 100
251 ms16268 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) : n(_n), l(n), d(n, 1), s(n, -1), 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<int> 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); for (int i = 0; i < N; i++) { int v = idx[i]; dsu.s[v] = S[v]; for (int u: adj[v]) { if (dsu.s[u] == -1) continue; int p = dsu.find(u); if (S[u] < S[v] && 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...