#include "wiring.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll min_total_length(vector<int> r, vector<int> b){
int n = r.size();
int m = b.size();
vector<pair<int,int>> v;
for (int i=0; i<n; i++) v.push_back({r[i], 0});
for (int i=0; i<m; i++) v.push_back({b[i], 1});
sort(v.begin(), v.end());
vector<int> bl(n+m);
bl[0] = 1;
for (int i=1; i<n+m; i++){
if (v[i].second == v[i-1].second) bl[i] = bl[i-1]+1;
else bl[i] = 1;
}
vector<ll> ps(n+m+1, 0);
for (int i=1; i<=n+m; i++) ps[i] = ps[i-1]+v[i-1].first;
vector<ll> dp(n+m+1, 1ll<<50);
dp[0] = 0;
int sp = 0;
for (int i=0; i<n+m; i++){
if (bl[i] == i+1) continue;
if (bl[i] == 1) sp = 0;
int lb = i-bl[i];
for (int j=sp; j<bl[lb]; j++){
ll k = (ps[i+1]-ps[lb+1])-(ps[lb+1]-ps[lb-j]);
if (bl[i] > j+1) k -= (ll)(bl[i]-(j+1))*(ll)v[lb].first;
else k += (ll)((j+1)-bl[i])*(ll)v[lb+1].first;
//cout << i << " " << j << " " << k << endl;
ll res;
if (j == bl[lb]-1) res = k+min(dp[lb-j], dp[lb-j+1]);
else res = k+dp[lb-j];
if (res > dp[i+1] && dp[i+1] != 1ll<<50) break;
sp = j;
dp[i+1] = min(dp[i+1], res);
}
}
return dp[n+m];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |