제출 #646042

#제출 시각아이디문제언어결과실행 시간메모리
646042dooompyStranded Far From Home (BOI22_island)C++17
0 / 100
168 ms21924 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; int s[200005]; int par[200005]; int sz[200005]; vector<int> tracker[200005]; bool able[200005]; int findset(int i) { return (par[i] == i ? i : par[i] = findset(par[i])); } void merge(int a, int b) { if (a == b) return; if (tracker[a].size() > tracker[b].size()) swap(a, b); for (auto a : tracker[a]) tracker[b].push_back(a); par[a] = b; sz[b] += sz[a]; } struct edge { int from, to; bool check; }; 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<edge> edges; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; if (s[a] == s[b]) edges.push_back({a, b, false}); else { edges.push_back({a, b, true}); edges.push_back({b, a, false}); } } sort(edges.begin(), edges.end(), [](edge a, edge b) { if (s[a.from] == s[b.from]) { return s[a.to] < s[b.to]; } return s[a.from] < s[b.from]; }); for (int i = 1; i <= n; i++) able[i] =true; for (auto edge : edges) { int a = findset(edge.from), b = findset(edge.to); // check if edge.first -> edge.second if (!edge.check) { merge(a, b); continue; } if (sz[a] >= sz[b]) { // still ok merge(a, b); } else { for (auto cur : tracker[a]) { able[cur] = false; } tracker[a].clear(); tracker[a].shrink_to_fit(); } } 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...