제출 #540868

#제출 시각아이디문제언어결과실행 시간메모리
540868sliviu전선 연결 (IOI17_wiring)C++17
100 / 100
54 ms10852 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; ll min_total_length(vector<int> r, vector<int> b) { int n = r.size(), m = b.size(), cr = 0, cb = 0; vector<pair<int, int>> a = {{0,0}}; for (auto x : r) a.emplace_back(x, 0); for (auto x : b) a.emplace_back(x, 1); sort(a.begin() + 1, a.end()); vector<ll> dp(n + m + 1, 1e18), sr(n + m + 1), sb(n + m + 1); vector<int> last(n + m + 1, -1); dp[0] = 0; last[m] = 0; for (int i = 1; i <= n + m; ++i) { auto [x, t] = a[i]; ++(t ? cb : cr); sr[i] = sr[i - 1], sb[i] = sb[i - 1]; (t ? sb[i] : sr[i]) += x; if (t) { int j = lower_bound(r.begin(), r.end(), x) - r.begin(); if (j != n) dp[i] = min(dp[i], dp[i - 1] + r[j] - x); if (j) dp[i] = min(dp[i], dp[i - 1] + x - r[j - 1]); } else { int j = lower_bound(b.begin(), b.end(), x) - b.begin(); if (j != m) dp[i] = min(dp[i], dp[i - 1] + b[j] - x); if (j) dp[i] = min(dp[i], dp[i - 1] + x - b[j - 1]); } if (last[cr - cb + m] != -1) { int l = last[cr - cb + m]; dp[i] = min(dp[i], dp[l] + abs((sr[i] - sr[l]) - (sb[i] - sb[l]))); } last[cr - cb + m] = i; } return dp[n + m]; }
#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...