제출 #1186196

#제출 시각아이디문제언어결과실행 시간메모리
1186196raspyNile (IOI24_nile)C++20
38 / 100
54 ms8636 KiB
#include "nile.h" #include <algorithm> #include <numeric> #include <iostream> #include <vector> using namespace std; typedef long long ll; int findp(vector<int>& par, int x) { return par[x] == x ? x : par[x] = findp(par, par[x]); } vector<long long> calculate_costs(vector<int> w, vector<int> A, vector<int> B, vector<int> E) { int n = A.size(); int q = E.size(); vector<int> par(n); vector<int> sz(n, 1); vector<ll> mn(n), sm(n); for (int i = 0; i < n; i++) { par[i] = i; sm[i] = (ll)A[i] - B[i]; // saving for artifact i. mn[i] = sm[i]; // for a singleton, the min saving equals its saving. } ll tre = 0; for (int i = 0; i < n; i++) { tre += A[i]; } vector<int> ixsw(n); iota(ixsw.begin(), ixsw.end(), 0); sort(ixsw.begin(), ixsw.end(), [&w](int i, int j) { return w[i] < w[j]; }); vector<pair<int,int>> queries(q); for (int i = 0; i < q; i++) { queries[i] = { E[i], i }; } sort(queries.begin(), queries.end()); vector<pair<int,int>> edges; for (int i = 0; i + 1 < n; i++) { edges.push_back({ ixsw[i], ixsw[i+1] }); } sort(edges.begin(), edges.end(), [&w](pair<int,int> p1, pair<int,int> p2) { return abs(w[p1.first] - w[p1.second]) < abs(w[p2.first] - w[p2.second]); }); vector<ll> rez(q); int edgeIndex = 0; for (int i = 0; i < q; i++) { int d = queries[i].first; int qIdx = queries[i].second; while (edgeIndex < edges.size() && abs(w[edges[edgeIndex].first] - w[edges[edgeIndex].second]) <= d) { int u = edges[edgeIndex].first; int v = edges[edgeIndex].second; int ru = findp(par, u); int rv = findp(par, v); if (ru == rv) { edgeIndex++; continue; } ll disc_ru = (sz[ru] % 2 == 1) ? (sm[ru] - mn[ru]) : sm[ru]; ll disc_rv = (sz[rv] % 2 == 1) ? (sm[rv] - mn[rv]) : sm[rv]; ll oldDiscount = disc_ru + disc_rv; if (sz[ru] < sz[rv]) { swap(ru, rv); } par[rv] = ru; sz[ru] += sz[rv]; sm[ru] += sm[rv]; mn[ru] = min(mn[ru], mn[rv]); ll newDiscount = (sz[ru] % 2 == 1) ? (sm[ru] - mn[ru]) : sm[ru]; tre -= (newDiscount - oldDiscount); edgeIndex++; } rez[qIdx] = tre; } return rez; }
#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...