Submission #1144469

#TimeUsernameProblemLanguageResultExecution timeMemory
1144469gygWiring (IOI17_wiring)C++20
0 / 100
1096 ms9724 KiB
#include "wiring.h" #include <bits/stdc++.h> using namespace std; #define sig signed #define int long long #define arr array #define vec vector #define pii pair<int, int> #define fir first #define sec second const int N = 2e5 + 5, INF = 1e18; int n; arr<pii, N> a; vec<vec<int>> rng; void rng_cmp() { for (int i = 1; i <= n; i++) { if (rng.empty() || a[i].sec != rng.back()[2]) rng.push_back({i, i, a[i].sec}); else rng.back()[1] = i; } } int scr(int l1, int r1, int l2, int r2) { int ans = 0; for (int i = l1; i <= r1; i++) ans -= a[i].fir; for (int i = l2; i <= r2; i++) ans += a[i].fir; int sz1 = r1 - l1 + 1, sz2 = r2 - l2 + 1; if (sz1 > sz2) ans += (sz1 - sz2) * a[l2].fir; else ans -= (sz2 - sz1) * a[r1].fir; return ans; } arr<int, N> dp; void dp_cmp() { for (int i = 1; i <= n; i++) { dp[i] = INF; vec<int> tr = {i, INF, INF}; int cr = upper_bound(rng.begin(), rng.end(), tr) - 1 - rng.begin(); if (cr == 0) continue; int prv = cr - 1; for (int j = rng[prv][0]; j <= rng[prv][1]; j++) { dp[i] = min(dp[i], dp[j - 1] + scr(j, rng[prv][1], rng[cr][0], i)); } // cout << i << ": " << dp[i] << endl; } } int min_total_length(vec<sig> _a0, vec<sig> _a1) { n = _a0.size() + _a1.size(); for (int i = 1; i <= _a0.size(); i++) a[i] = {_a0[i - 1], 0}; for (int i = _a0.size() + 1; i <= n; i++) a[i] = {_a1[i - _a0.size() - 1], 1}; sort(a.begin() + 1, a.begin() + n + 1); rng_cmp(); dp_cmp(); // for (int i = 1; i <= n; i++) // cout << a[i].fir << " " << a[i].sec << '\n'; // for (vec<int> x : rng) { // for (int y : x) cout << y << " "; // cout << '\n'; // } 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...