Submission #968698

#TimeUsernameProblemLanguageResultExecution timeMemory
968698vladiliusStranded Far From Home (BOI22_island)C++17
100 / 100
195 ms42188 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; struct dsu{ vector<int> p, sz; vector<bool> out; vector<vector<int>> all; vector<ll> s; int n; dsu(int ns, vector<int>& x){ n = ns; p.resize(n + 1); sz.resize(n + 1); s.resize(n + 1); out.assign(n + 1, 1); all.resize(n + 1); for (int i = 1; i <= n; i++){ p[i] = i; sz[i] = 1; s[i] = x[i]; all[i] = {i}; } } int get(int v){ if (p[v] != v){ p[v] = get(p[v]); } return p[v]; } void unite(int x, int y, int val){ x = get(x); y = get(y); if (x == y) return; if (s[x] < val){ for (int i: all[x]){ out[i] = 0; } } if (sz[x] > sz[y]){ swap(x, y); } p[x] = y; sz[y] += sz[x]; for (int i: all[x]) all[y].push_back(i); s[y] += s[x]; } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; vector<int> x(n + 1), p = {0}; for (int i = 1; i <= n; i++){ cin>>x[i]; p.push_back(i); } auto cmp = [&](int i, int j){ return x[i] < x[j]; }; sort(p.begin(), p.end(), cmp); vector<int> g[n + 1]; while (m--){ int a, b; cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } int i = 1; dsu T(n, x); while (i <= n){ int j = i; while (j <= n && x[p[i]] == x[p[j]]){ j++; } for (int k = i; k < j; k++){ int v = p[k]; for (int u: g[v]){ if (x[u] <= x[v]){ T.unite(u, v, x[v]); } } } i = j; } for (int i = 1; i <= n; i++){ cout<<T.out[i]; } cout<<"\n"; }
#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...