제출 #646078

#제출 시각아이디문제언어결과실행 시간메모리
646078dooompyStranded Far From Home (BOI22_island)C++17
100 / 100
150 ms29748 KiB
#include "bits/stdc++.h" using namespace std; void abc() {cout << endl;} template <typename T, typename ...U> void abc(T a, U ...b) { cout << a << ' ', abc(b...); } template <typename T> void printv(T l, T r) { while (l != r) cout << *l << " \n"[++l == r]; } template <typename A, typename B> istream& operator >> (istream& o, pair<A, B> &a) { return o >> a.first >> a.second; } template <typename A, typename B> ostream& operator << (ostream& o, pair<A, B> a) { return o << '(' << a.first << ", " << a.second << ')'; } template <typename T> ostream& operator << (ostream& o, vector<T> a) { bool is = false; for (T i : a) {o << (is ? ' ' : '{'), is = true, o << i;} return o << '}'; } #ifdef local #define test(args...) abc("[" + string(#args) + "]", args) #else #define test(args...) void(0) #endif using ll = long long; ll s[200005]; int par[200005]; ll sz[200005]; vector<int> tracker[200005]; bool able[200005]; int findset(int i) { return (par[i] == i ? i : par[i] = findset(par[i])); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("", "r", stdin); // freopen("", "w", stdout); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) cin >> s[i]; for (int i = 1; i <= n; i++) { par[i] = i; sz[i] = s[i]; tracker[i].push_back(i); } vector<pair<int, int>> edges; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; if (s[a] < s[b]) edges.emplace_back(a, b); else edges.emplace_back(b, a); } sort(edges.begin(), edges.end(), [](pair<int, int> a, pair<int, int> b) { return s[a.second] < s[b.second]; }); for (auto edge : edges) { int a = findset(edge.first), b = findset(edge.second); // check if edge.first -> edge.second if (a == b) continue; if (sz[a] >= s[edge.second]) { // still ok if (tracker[b].size() < tracker[a].size()) tracker[b].swap(tracker[a]); for (auto cur : tracker[a]) tracker[b].push_back(cur); } sz[b] += sz[a]; par[a] = b; } for (auto cur : tracker[findset(1)]) { able[cur] = true; } for (int i = 1; i <= n; i++) { if (able[i]) cout << "1"; else cout << "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...