Submission #56215

#TimeUsernameProblemLanguageResultExecution timeMemory
56215fallingstarWiring (IOI17_wiring)C++14
100 / 100
96 ms94848 KiB
#include "wiring.h"
#include <algorithm>
#include <vector>
#include <queue>

#define long long long

using namespace std;

typedef pair<int, int> pii;

const int N = 2e5 + 2;
const long INF = 1LL << 60;

int n;
long f[N], pref[N], suff[N];
pair<int, bool> a[N];

long Solve()
{
    sort(a + 1, a + 1 + n);
    int lastL = 0, lastR = 0, gap = 0;
    long rsum = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (i > 1 && a[i].second != a[i - 1].second)
        {
            lastL = lastR + 1;
            lastR = i - 1;
            gap = a[i].first - a[i - 1].first;
            pref[lastL - 1] = suff[lastR + 1] = INF;
            long lsum = 0;
            for (int j = lastR; j >= lastL; --j)
            {
                lsum += a[lastR].first - a[j].first;
                suff[j] = min(suff[j + 1], min(f[j - 1], f[j]) + lsum);
                pref[j] = min(f[j - 1], f[j]) + lsum + (long) (lastR - j + 1) * gap;
            }
            for (int j = lastL + 1; j <= lastR; ++j)
                pref[j] = min(pref[j], pref[j - 1]);
            rsum = 0;
        }
        rsum += a[i].first - a[lastR + 1].first;
        f[i] = INF;
        if (lastR != 0)
        {
            f[i] = min(f[i], suff[max(lastR * 2 - i + 1, lastL)] + (long) (i - lastR) * gap + rsum);
            
            f[i] = min(f[i], pref[max(lastR * 2 - i + 1, lastL) - 1] + rsum);
        }
    }
    return f[n];
}

long min_total_length(vector<int> r_, vector<int> b_) {
    for (int p: r_) a[++n] = {p, 0};
    for (int p: b_) a[++n] = {p, 1};
	return Solve();
}
#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...