Submission #1179593

#TimeUsernameProblemLanguageResultExecution timeMemory
1179593tamyteStranded Far From Home (BOI22_island)C++20
100 / 100
123 ms31576 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<vector<int>> lefty; struct DSU { vector<int> e; vector<ll> sum; DSU(int n) { e = vector<int>(n, -1); sum = vector<ll>(n); } int get(int x) { return e[x] < 0 ? x : e[x] = get(e[x]); } void unite(int x, int y) { x = get(x); y = get(y); if (x == y) return; if (lefty[x].size() < lefty[y].size()) swap(x, y); e[x] += e[y]; sum[x] += sum[y]; e[y] = x; } }; void merge(int x, int y) { if (lefty[x].size() < lefty[y].size()) { swap(x, y); } lefty[x].insert(lefty[x].end(), make_move_iterator(lefty[y].begin()), make_move_iterator(lefty[y].end())); lefty[y].clear(); } int main(){ // random_device rd; // mt19937 rng(rd()); ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<vector<int>> adj(n); vector<int> v(n); lefty = vector<vector<int>>(n); for (int i = 0; i < n; ++i) { lefty[i].push_back(i); } DSU dsu(n); for (int i = 0; i < n; ++i) { cin >> v[i]; dsu.sum[dsu.get(i)] += v[i]; } for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; --a; --b; adj[a].push_back(b); adj[b].push_back(a); } vector<int> id(n); iota(begin(id), end(id), 0); sort(begin(id), end(id), [&](const int x, const int y) { return v[x] < v[y]; }); vector<bool> open(n); for (int i = 0; i < n;) { int j = i; int ii = id[i]; // cout << "BEGIN: "; for (int jj = id[j]; j < n && v[ii] == v[jj]; ++j, jj = id[j]) { // cout << id[j] << " "; open[jj] = true; } j = i; // for (auto u : open) { // cout << u << " "; // } // cout << endl; for (int jj = id[j]; j < n && v[ii] == v[jj]; ++j, jj = id[j]) { for (auto& u : adj[jj]) { if (!open[u]) continue; int v1 = dsu.get(jj); int v2 = dsu.get(u); if (v1 == v2) continue; if (dsu.sum[v1] < v[u]) { lefty[v1].clear(); } if (dsu.sum[v2] < v[jj]) { lefty[v2].clear(); } // cout << "NOW: " << dsu.sum[v1] << " " << dsu.sum[v2] << endl; merge(v1, v2); if (dsu.sum[v2] >= v[jj] || dsu.sum[v1] >= v[u]) { dsu.unite(v1, v2); } } } // cout << i << " " << j << endl; i = j; } vector<int> res(n); for (int i = 0; i < n; ++i) { for (auto& u : lefty[i]) { res[u] = 1; } } for (auto& u : res) { cout << u; } cout << endl; }
#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...