Submission #598041

#TimeUsernameProblemLanguageResultExecution timeMemory
598041boris_mihovStranded Far From Home (BOI22_island)C++14
100 / 100
215 ms31068 KiB
#include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> typedef long long llong; const int MAXN = 200000 + 10; const int INF = 1e9 + 10; int n, m; int a[MAXN], s[MAXN], inS[MAXN]; std::vector < int > g[MAXN]; std::vector < int > alive[MAXN]; struct DSUelement { int par; int sum; } c[MAXN]; int find(int x) { if (c[x].par == x) return x; return c[x].par = find(c[x].par); } void connect(int x, int y) { x = find(x); y = find(y); if (alive[x].size() > alive[y].size()) std::swap(x, y); c[x].par = y; c[y].sum += c[x].sum; c[y].sum = std::min(c[y].sum, INF); alive[y].reserve(alive[x].size()); for (int i : alive[x]) { alive[y].push_back(i); } } bool areConnected(int x, int y) { return find(x) == find(y); } char ans[MAXN]; void solve() { std::iota(s+1, s+n+1, 1); std::sort(s+1, s+n+1, [&](int x, int y) { return a[x] < a[y]; }); for (int i = 1 ; i <= n ; ++i) { inS[s[i]] = i; c[i].par = i; c[i].sum = a[i]; alive[i].push_back(i); } for (int i = 1 ; i <= n ; ++i) { int x = s[i]; for (const int &j : g[x]) { if (inS[j] > i || areConnected(x, j)) continue; int par = find(j); if (c[par].sum < a[x]) { alive[par].clear(); } connect(x, j); } } int findPar = find(1); std::fill(ans, ans+n, '0'); for (int i : alive[findPar]) { ans[i-1] = '1'; } ans[n] = '\0'; std::cout << ans << '\n'; } void read() { std::cin >> n >> m; for (int i = 1 ; i <= n ; ++i) { std::cin >> a[i]; } for (int i = 1 ; i <= m ; ++i) { int x, y; std::cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } } void fastIO() { std::ios_base :: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } int main() { fastIO(); read(); solve(); 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...