Submission #1257309

#TimeUsernameProblemLanguageResultExecution timeMemory
1257309nerrrminNile (IOI24_nile)C++20
67 / 100
2093 ms12884 KiB
#include "nile.h" #define pb push_back #include<bits/stdc++.h> using namespace std; const int maxn = 3e5 + 10; int n, q; long long w[maxn], a[maxn], b[maxn]; long long dp[maxn]; /// best match count long long r[maxn]; long long ans; long long pa[maxn], sz[maxn], res[maxn]; long long best[maxn], bs[maxn]; int find_leader(int i) { if(pa[i] == i)return i; return (pa[i] = find_leader(pa[i])); } void unite(int i, int j) { i = find_leader(i); j = find_leader(j); ans -= res[i]; ans -= res[j]; sz[i] += sz[j]; pa[j] = i; best[i] = min(best[i], best[j]); bs[i] += bs[j]; res[i] = bs[i] + best[i];//(sz[i] % 2); ans += res[i]; } vector < pair < int, int > > u; long long solve(int d) { vector < pair < int, int > > pack; pack.pb({w[0], 0}); long long ans = 0; for (int i = 1; i < n; ++ i) { int last = pack[pack.size()-1].first; if(w[i] - last <= d) { pack.pb({w[i], i}); continue; } long long sumb = 0, best = 1e17; for (int j = 0; j < pack.size(); ++ j) { int index = pack[j].second; sumb += b[index]; if(j % 2 == 0)best = min(best, a[index] - b[index]); else if(j != pack.size()-1) { int pre = pack[j-1].first; int nxt = pack[j+1].first; if(nxt - pre <= d)best = min(best, a[index] - b[index]); } } ans += sumb; if(pack.size() % 2 == 1)ans += best; pack.clear(); pack.pb({w[i], i}); } long long sumb = 0, best = 1e17; for (int j = 0; j < pack.size(); ++ j) { int index = pack[j].second; sumb += b[index]; if(j % 2 == 0)best = min(best, a[index] - b[index]); else if(j != pack.size()-1) { int pre = pack[j-1].first; int nxt = pack[j+1].first; if(nxt - pre <= d)best = min(best, a[index] - b[index]); } } ans += sumb; if(pack.size() % 2 == 1)ans += best; pack.clear(); return ans; /*vector < pair < int, int > > g; for (int i = 1; i < n; ++ i) { int d = w[i] - w[i-1]; g.push_back(make_pair(d, i-1)); } sort(g.begin(), g.end()); int i = 0; for (auto &[dif, pos]: u) { while(i < g.size() && g[i].first <= dif) { int posx = g[i].second; int posy = posx + 1; unite(posx, posy); i ++; } r[pos] = ans; }*/ } struct p { int w, a, b; p(){}; p(int _w, int _a, int _b) { w = _w; a = _a; b = _b; } }; bool cmp(p p1, p p2) { return (p1.w < p2.w); } std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) { n = W.size(); for (int i = 0; i < n; ++ i) w[i] = W[i]; for (int i = 0; i < n; ++ i) a[i] = A[i]; for (int i = 0; i < n; ++ i) b[i] = B[i]; vector < p > g; for (int i = 0; i < n; ++ i) g.pb(p(w[i], a[i], b[i])); sort(g.begin(), g.end(), cmp); int i = 0; for (auto &[ww, aa, bb]: g) { w[i] = ww; a[i] = aa; b[i] = bb; i ++; } for (int i = 0; i < n; ++ i) { pa[i] = i; sz[i] = 1; res[i] = a[i]; bs[i] = b[i]; best[i] = a[i] - b[i]; ans += a[i]; } q = (int)E.size(); vector < long long > result; for (int i = 0; i < q; ++ i) { result.pb(solve(E[i])); } return result; }
#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...