제출 #1154888

#제출 시각아이디문제언어결과실행 시간메모리
1154888alexdd전선 연결 (IOI17_wiring)C++20
100 / 100
44 ms17692 KiB
#include "wiring.h"
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int dp[200005];
int tole[200005],tori[200005];
int pref[200005];
int minp[200005][2],mins[200005][2];
long long min_total_length(std::vector<int32_t> r, std::vector<int32_t> b)
{
    vector<pair<int,int>> v;
    for(int x:r)
        v.push_back({x,0});
    for(int x:b)
        v.push_back({x,1});
    v.push_back({-1,-1});
    sort(v.begin(),v.end());
    int ult[2] = {0,0};
    for(int i=1;i<v.size();i++)
    {
        ult[v[i].second] = i;
        tole[i] = ult[1-v[i].second];
        pref[i] = pref[i-1] + v[i].first;
    }
    ult[0] = ult[1] = (int)v.size()-1;
    for(int i=(int)v.size()-1;i>0;i--)
    {
        ult[v[i].second] = i;
        tori[i] = ult[1-v[i].second];
    }
    int idk=INF;
    for(int i=1;i<v.size();i++)
    {
        if(v[i].second != v[i-1].second)
        {
            int primu = i-1;
            for(int j=i-2;j>0;j--)
            {
                dp[j] = min(dp[j], dp[j+1]);
                if(v[j].second != v[i-1].second)
                    break;
                primu = j;
            }
            int mnm=INF,mnm2=INF;
            for(int j=primu-1;j<=i-2;j++)
            {
                mnm = min(mnm, dp[j] + pref[j] - v[tori[j+1]].first * j);
                mnm2 = min(mnm2, pref[j] - v[tori[j+1]].first * j);
                minp[j][0] = mnm;
                minp[j][1] = mnm2;
            }
            mnm=mnm2=INF;
            for(int j=i-2;j>=primu-1;j--)
            {
                mnm = min(mnm, dp[j] + pref[j] - v[tori[j+1]-1].first * j);
                mnm2 = min(mnm2, pref[j] - v[tori[j+1]-1].first * j);
                mins[j][0] = mnm;
                mins[j][1] = mnm2;
            }
            idk=INF;
        }
        dp[i]=INF;
        int ri = tole[i];
        if(ri==0)
            continue;
        int le = tole[ri]+1;
        int lim = min(2*ri-i, ri-1);
        lim = max(lim, le-2);

        int mnm=INF,mnm2=INF;
        /*for(int j=le-1;j<=lim;j++)
        {
            mnm = min(mnm, dp[j] + pref[j] - v[tori[j+1]].first * j);
            mnm2 = min(mnm2, pref[j] - v[tori[j+1]].first * j);
        }*/
        if(lim>=le-1)
        {
            mnm = minp[lim][0];
            mnm2 = minp[lim][1];
        }
        mnm = min(mnm, mnm2 + idk);
        dp[i] = min(dp[i], mnm + ri * (v[ri+1].first - v[ri].first));

        mnm=mnm2=INF;
        /*for(int j=lim+1;j<=ri-1;j++)
        {
            mnm = min(mnm, dp[j] + pref[j] - v[tori[j+1]-1].first * j);
            mnm2 = min(mnm2, pref[j] - v[tori[j+1]-1].first * j);
        }*/
        if(lim+1 <= ri-1)
        {
            mnm = mins[lim+1][0];
            mnm2 = mins[lim+1][1];
        }
        mnm = min(mnm, mnm2 + idk);
        dp[i] = min(dp[i], mnm + (i-ri) * (v[ri+1].first - v[ri].first));

        dp[i] += pref[i] - pref[ri]*2 - v[ri+1].first * (i-ri) + v[ri].first * ri;
        dp[i] = min(dp[i], INF);
        idk = min(idk, dp[i]);
    }
    return dp[(int)v.size()-1];
}
/*


*/
#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...