Submission #1203436

#TimeUsernameProblemLanguageResultExecution timeMemory
1203436abczzNile (IOI24_nile)C++20
38 / 100
64 ms15924 KiB
#include "nile.h" #include <iostream> #include <vector> #include <algorithm> #include <array> #define ll long long using namespace std; ll P[100000], tot[100000], sz[100000], opt[100000]; ll dsu(ll u) { if (P[u] == u) return u; else return P[u] = dsu(P[u]); } std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) { vector <array<ll, 3> > X, Q; vector <ll> F; F.resize(E.size()); ll n = W.size(), f = 0; for (int i=0; i<n; ++i) { f += A[i]; X.push_back({W[i], A[i], B[i]}); } sort(X.begin(), X.end()); for (int i=0; i<n; ++i) P[i] = i, tot[i] = X[i][2], sz[i] = 1, opt[i] = X[i][1]-X[i][2]; for (int i=0; i<n-1; ++i) { Q.push_back({X[i+1][0]-X[i][0], 0, i}); } for (int i=0; i<E.size(); ++i) { Q.push_back({E[i], 1, i}); } sort(Q.begin(), Q.end()); for (auto [w, ty, u] : Q) { if (ty == 0) { ll a = dsu(u), b = dsu(u+1); f -= tot[a] + (sz[a] & 1 ? opt[a] : 0); f -= tot[b] + (sz[b] & 1 ? opt[b] : 0); P[a] = b; sz[b] += sz[a]; tot[b] += tot[a]; opt[b] = min(opt[b], opt[a]); f += tot[b] + (sz[b] & 1 ? opt[b] : 0); } else F[u] = f; } return F; }
#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...