Submission #1154849

#TimeUsernameProblemLanguageResultExecution timeMemory
1154849alexddWiring (IOI17_wiring)C++20
17 / 100
1095 ms9900 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];
int pref[200005];
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;
    }
    for(int i=1;i<v.size();i++)
    {
        dp[i]=INF;
        int ri = tole[i];
        if(ri==0)
            continue;
        int le = tole[ri]+1;
        int lim = min(2*ri-i, ri-1);
        int mnm=INF;
        for(int j=le-1;j<=lim;j++)
        {
            int aux=0;
            aux += v[ri].first * (ri-j) + pref[j];
            aux += (ri-j) * (v[ri+1].first - v[ri].first);

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

            mnm = min(mnm, aux + dp[j]);
        }
        dp[i] = min(dp[i], mnm + (i-ri) * (v[ri+1].first - v[ri].first));
        //dp[i] = min(dp[i], mnm);

        dp[i] += pref[i] - pref[ri]*2 - v[ri+1].first * (i-ri);
        dp[i] = min(dp[i], INF);
        for(int j=i-1;j>0;j--)
        {
            if(dp[i] >= dp[j])
                break;
            dp[j] = 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...