This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#include "wiring.h"
int n;
const long long inf = 1e18;
vector<int> groupInd;
vector<pair<int, int> > interv;
vector<pair<int, int> > groups;
vector<long long> toRight, toLeft;
vector<long long> ikiL, ikiR;
long long f(int l, int r) {
int prm = groups[l].second;
int ant = groups[r].second;
long long kekL = 0, kekR = 0;
long long maxL = 0, minR = 1e9;
long long sumL = 0, sumR = 0;
for(int i = l; i <= r; i++) {
kekL += (groups[i].second == prm);
kekR += (groups[i].second == ant);
if(groups[i].second == prm) {
sumL += groups[i].first;
maxL = max(maxL, 1ll * groups[i].first);
}else {
sumR += groups[i].first;
minR = min(minR, 1ll * groups[i].first);
}
}
long long ret = 0;
ret += toRight[l];
ret += toLeft[r];
ret += (minR - maxL) * max(ikiR[l], ikiL[r]);
return ret;
}
void calcToLeft(int l, int r) {
for(int i = l; i <= r; i++) {
toLeft[i] = (i == l ? 0ll : toLeft[i-1]) + groups[i].first - groups[l].first;
ikiL[i] = i - l + 1;
}
}
void calcToRight(int l, int r) {
for(int i = r; i >= l; i--) {
toRight[i] = (i == r ? 0ll : toRight[i+1]) + groups[r].first - groups[i].first;
ikiR[i] = r - i + 1;
}
}
long long min_total_length(vector<int> r, vector<int> b) {
n = r.size() + b.size();
for(auto &x : r) {
groups.push_back({x, 0});
}
for(auto &x : b) {
groups.push_back({x, 1});
}
groupInd.resize(n);
toLeft.resize(n);
toRight.resize(n);
ikiL.resize(n);
ikiR.resize(n);
sort(groups.begin(), groups.end());
for(int i = 0; i < n; i++) {
for(int j = i; j <= n; j++) {
if(j == n || groups[j].second != groups[i].second) {
int l = i;
int r = j-1;
interv.push_back({l, r});
for(int h = l; h <= r; h++) {
groupInd[h] = (int) interv.size()-1;
}
i = j-1;
calcToLeft(l, r);
calcToRight(l, r);
break;
}
}
} /*
cout << "intervalai: ";
for(auto &x : interv) {
cout << "(" << x.first << ", " << x.second << "), ";
}
cout << endl;*/
vector<long long> dp(n, inf);
// dp[-1] = 0;
for(int i = interv[1].first; i < n; i++) {
int myInterv = groupInd[i];
// cout << "skaiciuoju dp[" << i << "], manoInterv = " << myInterv << ":" << endl;
dp[i] = dp[interv[myInterv-1].second] + f(interv[myInterv-1].second, i);
for(int j = interv[myInterv-1].first; j <= interv[myInterv-1].second; j++) {
dp[i] = min(dp[i], (j == 0 ? 0ll : dp[j-1]) + f(j, i));
// cout << "gali buti (nuo " << j << ") " << (j == 0 ? 0ll : dp[j-1]) << " + f(" << j << ", " << i << ") = " << f(j, i) << endl;
}
// cout << "dp[" << i << "] = " << dp[i] << endl << endl;
}
return dp[n-1];
}
# | 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... |