Submission #1321506

#TimeUsernameProblemLanguageResultExecution timeMemory
1321506kasamchiWiring (IOI17_wiring)C++20
100 / 100
41 ms9144 KiB
#include "wiring.h" #include <bits/stdc++.h> using namespace std; long long min_total_length(vector<int> r, vector<int> b) { int N = r.size() + b.size(); int ridx = 0, bidx = 0; vector<int> pos = {0}, col = {0}; while (ridx < r.size() || bidx < b.size()) { if (bidx == b.size()) { pos.push_back(r[ridx]); col.push_back(0); ridx++; } else if (ridx == r.size()) { pos.push_back(b[bidx]); col.push_back(1); bidx++; } else if (r[ridx] < b[bidx]) { pos.push_back(r[ridx]); col.push_back(0); ridx++; } else { pos.push_back(b[bidx]); col.push_back(1); bidx++; } } vector<pair<int, int>> seg; for (int i = 1; i <= N; ) { int j = i; while (j <= N && col[i] == col[j]) { j++; } seg.push_back(make_pair(i, j - 1)); i = j; } vector<long long> pre(N + 1); vector<long long> suf(N + 1); for (int i = 0; i < seg.size(); i++) { int lb = seg[i].first, rb = seg[i].second; for (int j = rb - 1; j >= lb; j--) { suf[j] = suf[j + 1] + (pos[rb] - pos[j]); } for (int j = lb + 1; j <= rb; j++) { pre[j] = pre[j - 1] + (pos[j] - pos[lb]); } } vector<long long> dp(N + 1, (long long)1e18); dp[0] = 0; for (int sid = 1; sid < seg.size(); sid++) { int clb = seg[sid].first, crb = seg[sid].second; int plb = seg[sid - 1].first, prb = seg[sid - 1].second; for (int c = clb; c <= crb; c++) { auto calc = [&] (int p) { int psz = prb - p + 1; int csz = c - clb + 1; long long cost = 0; cost += suf[p] + pre[c]; cost += (long long)(pos[clb] - pos[prb]) * max(psz, csz); return min(dp[p - 1], dp[p]) + cost; }; if (sid == 1) { dp[c] = calc(plb); } else { int ll = plb, rr = prb + 1; while (ll + 1 < rr) { int mm = ll + (rr - ll) / 2; if (calc(mm) - calc(mm - 1) < 0) { ll = mm; } else { rr = mm; } } dp[c] = calc(ll); } } } return dp[N]; }
#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...