제출 #1105004

#제출 시각아이디문제언어결과실행 시간메모리
1105004MateiKing80Stranded Far From Home (BOI22_island)C++14
100 / 100
243 ms44184 KiB
#include <bits/stdc++.h> using namespace std; int papa(int u, vector<int> &p) { if(p[u] < 0) return u; return p[u] = papa(p[u], p); } void unite(int u, int v, vector<int> &p, vector<long long> &put) { u = papa(u,p), v = papa(v,p); if(u == v) return; if(p[u] > p[v]) swap(u,v); p[u] += p[v]; p[v] = u; put[u] += put[v]; } void dfs(int u, int sus, vector<int> &castig, vector<vector<int>> &ok) { castig[u] &= sus; for(int v : ok[u]) dfs(v, castig[u], castig, ok); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<int> s(n); for(int &x : s) cin >> x; vector<vector<int>> g(n); for(int i = 0, u, v; i < m; i ++) { cin >> u >> v; u--, v--; g[u].push_back(v), g[v].push_back(u); } vector<int> castig(n, 1), p(n, -1), viz(n), ins(n), rep(n); vector<long long> put(n); vector<vector<int>> ok(n); vector<pair<int,int>> order(n); for(int i = 0; i < n; i ++) { put[i] = s[i]; order[i] = {s[i], i}; } sort(order.begin(), order.end()); for(auto t : order) { int u = t.second; for(int v : g[u]) if(ins[v]) { int w = rep[papa(v,p)]; if(put[papa(v,p)] < s[u]) castig[w] = 0; if(!viz[w]) { ok[u].push_back(w); viz[w] = 1; } } for(int v : g[u]) if(ins[v]) viz[rep[papa(v,p)]] = 0; for(int v : g[u]) if(ins[v]) unite(u, v, p, put); rep[papa(u,p)] = u; ins[u] = 1; } dfs(order[n - 1].second, 1, castig, ok); for(int i = 0; i < n; i ++) cout << castig[i]; }
#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...