Submission #1183722

#TimeUsernameProblemLanguageResultExecution timeMemory
1183722rayan_bdNile (IOI24_nile)C++20
100 / 100
93 ms23228 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define ll long long #define pb push_back #define all(x) x.begin(), x.end() const int mxN = 1e5 + 1000; const ll INF = 2e18; ll parent[mxN], sz[mxN], bsum[mxN], c1[mxN], c2[mxN], c3[mxN], c[mxN], mn[mxN]; // c1 even vector<vector<int>> nvec; vector<pair<int, int>> qry; vector<pair<ll, pair<bool, int>>> diff; int find_par(int u) { if (parent[u] == u) return u; return parent[u] = find_par(parent[u]); } ll get_answer(int u) { int par = find_par(u); if (sz[par] & 1 ^ 1) return bsum[par]; else { if (mn[par] & 1) return bsum[par] + min(c2[par], c3[par]); else return bsum[par] + min(c1[par], c3[par]); } } void unite(int u, int v) { int ulp = find_par(u); int vlp = find_par(v); if (ulp == vlp) return; parent[ulp] = vlp; sz[vlp] += sz[ulp]; bsum[vlp] += bsum[ulp]; mn[vlp] = min(mn[vlp], mn[ulp]); c1[vlp] = min(c1[vlp], c1[ulp]); c2[vlp] = min(c2[vlp], c2[ulp]); c3[vlp] = min(c3[vlp], c3[ulp]); } void upd(int u, ll x) { int ulp = find_par(u); c3[ulp] = min(c3[ulp], x); } std::vector<long long> calculate_costs( std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) { int N = W.size(), Q = E.size(); int idx = 0; ll ans = 0; vector<ll> res(Q); for (int i = 0; i < N; ++i) { nvec.pb({W[i], A[i], B[i]}); ans += A[i]; } for (int i = 0; i < Q; ++i) { qry.pb({E[i], i}); } sort(all(qry)); sort(all(nvec)); for (int i = 0; i < N; ++i) { parent[i] = i; bsum[i] = nvec[i][2]; sz[i] = 1; c1[i] = c2[i] = c3[i] = INF; mn[i] = i; c[i] = nvec[i][1] - nvec[i][2]; if (i & 1 ^ 1) c1[i] = c[i]; else c2[i] = c[i]; } for (int i = 0; i < N - 1; ++i) { diff.pb({nvec[i + 1][0] - nvec[i][0], {0, i}}); if (i + 2 < N) { diff.pb({nvec[i + 2][0] - nvec[i][0], {1, i}}); } } sort(all(diff), [&](pair<int, pair<bool, int>> v1, pair<int, pair<bool, int>> v2) { if(v1.fi==v2.fi){ return (int)v1.se.fi<(int)v2.se.fi; } return v1.fi<v2.fi; }); for (auto it : qry) { while (idx < (int)diff.size() && diff[idx].fi <= it.fi) { ans -= get_answer(diff[idx].se.se); if (find_par(diff[idx].se.se) != find_par(diff[idx].se.se + 1)) { ans -= get_answer(diff[idx].se.se + 1); } if (diff[idx].se.fi) { upd(diff[idx].se.se, c[diff[idx].se.se + 1]); } // cout << ans << " "; unite(diff[idx].se.se, diff[idx].se.se + 1); ans += get_answer(diff[idx].se.se); // cout << ans << " " << get_answer(diff[idx].se.se) << endl; ++idx; } res[it.se] = ans; } return res; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...