제출 #723048

#제출 시각아이디문제언어결과실행 시간메모리
723048drdilyorStranded Far From Home (BOI22_island)C++17
100 / 100
899 ms135396 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; struct dsu { vector<int> par; vector<ll> sum; vector<vector<int>> el; vector<set<int>> ed; dsu(int n, vector<int> s) : par(n), sum(s.begin(), s.end()), el(n), ed(n) { for (int i = 0; i < n; i++) par[i] = i, el[i] = {i}; } int get(int i) { return par[i] == i ? par[i] : par[i] = get(par[i]); } void edge(int i, int j) { ed[get(i)].insert(j); } void merge(int a, int b) { a = get(a); b = get(b); if (el[a].size() < el[b].size()) swap(a, b); if (a != b) { par[b] =a; sum[a] += sum[b]; for (int x : el[b]) el[a].push_back(x); if (ed[a].size() < ed[b].size()) swap(ed[a], ed[b]); for (int x : ed[b]) ed[a].insert(x); } } }; int main() { int n, m; cin >> n >> m; vector s(n, 0); for (int& i : s) cin >> i; vector<int> ix(n); for (int i{}; i < n ;i++) ix[i] = i; stable_sort(ix.begin(), ix.end(), [&](int a, int b) { return s[a] > s[b]; }); vector<int> jx(n); for (int i = 0; i < n; i ++) jx[ix[i]] = i; stable_sort(s.begin(), s.end(), greater{}); vector<vector<int>> adj(n); for (int i = 0; i < m ;i++) { int u, v; cin >> u >> v; u--;v--; adj[jx[u]].push_back(jx[v]); adj[jx[v]].push_back(jx[u]); } for (int i = 0; i < n; i++) { sort(adj[i].begin(), adj[i].end()); } //for (int i : ix) cout << i << ' ';cout << endl; //for (int i : jx) cout << i << ' ';cout << endl; //for (int i : s) cout << i << ' ';cout << endl; string res(n, '?'); vector<int> back(n, -1); dsu cc(n, s); for (int i =n -1; i >= 0;i --) { for (int j : adj[i]) { cc.edge(i, j); if (j > i) cc.merge(i, j); } int c = cc.get(i); ll sum = cc.sum[c]; auto it = cc.ed[c].lower_bound(i); if (it != cc.ed[c].begin()) { --it; back[i] = max(back[i], *it); } if (back[i] != -1 && s[back[i]] > sum) back[i] = -1; if (back[i] == -1) { if (i == 0) res[i] = '1'; else res[i] = '0'; } } string ans(n, '?'); for (int i = 1; i < n;i++) { if (back[i] != -1) res[i] = res[back[i]]; } for (int i = 0; i < n; i++) { ans[ix[i]] = res[i]; } cout << ans << '\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...