제출 #1325834

#제출 시각아이디문제언어결과실행 시간메모리
1325834FaggiWiring (IOI17_wiring)C++20
100 / 100
35 ms10832 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

long long min_total_length(std::vector<int> r, std::vector<int> b)
{
    ll INF = 1e14 + 1;
    vector<ll> dp(sz(r) + sz(b), INF);
    vector<vector<ll>> v, pref;
    ll i = 0, j = 0, sum, curr;
    vector<ll> act;
    while (i < sz(r) || j < sz(b))
    {
        act = {};
        while (i < sz(r) && (j >= sz(b) || r[i] < b[j]))
        {
            act.pb(r[i]);
            i++;
        }
        if (sz(act))
        {
            v.pb(act);
            continue;
        }
        act = {};
        while (j < sz(b) && (i >= sz(r) || r[i] > b[j]))
        {
            act.pb(b[j]);
            j++;
        }
        if (sz(act))
        {
            v.pb(act);
            continue;
        }
    }
    for (i = 0; i < sz(v); i++)
    {
        act = {};
        sum = 0;
        for (j = 0; j < sz(v[i]); j++)
        {
            sum += v[i][j];
            act.pb(sum);
        }
        pref.pb(act);
    }
    curr = sz(v[0]);
    ll k, mid, in, ac, fin, cost, cant, L = sz(v[0]), ant;
    for (i = 1; i < sz(v); i++)
    {
        mid = v[i][0] - v[i - 1].back();
        in = v[i][0];
        fin = v[i - 1].back();
        sum = 0;
        vector<ll> mi, ma;
        ac = 0;
        cant = 0;
        for (k = sz(v[i - 1]) - 1; k >= 0; k--)
        {
            cant++;
            ac += fin - v[i - 1][k];
            cost = ac;
            ant = 0;
            if (L - 1 - cant >= 0)
                ant = min(dp[L - 1 - cant], dp[L - cant]);
            if (sz(mi) == 0)
                mi.pb(ant + cost);
            else
                mi.pb(min(mi.back(), ant + cost));
            ma.pb(ant + cost + mid * cant);
        }
        for(k=sz(ma)-2; k>=0; k--)
            ma[k]=min(ma[k],ma[k+1]);
        for (j = 0; j < sz(v[i]); j++)
        {
            sum += v[i][j] - in;
            if(j<sz(v[i-1]))
                dp[L+j]=min(mi[j]+mid*(j+1),ma[j])+sum;
            else
                dp[L+j]=mi.back()+mid*(j+1)+sum;
        }
        L += sz(v[i]);
    }
    return dp.back();
}
#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...