제출 #427696

#제출 시각아이디문제언어결과실행 시간메모리
427696JeanBombeur전선 연결 (IOI17_wiring)C++17
100 / 100
63 ms10088 KiB
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include "wiring.h"
using namespace std;

const long long INFINI = (1000 * 1000 * 1000);
const int MAX_BLOCS = (200 * 1000 + 1);

long long DP[MAX_BLOCS];
long long PrefixSum[MAX_BLOCS];

pair <long long, int> Positions[MAX_BLOCS];

int nbBlocs = 0;

long long min_total_length(vector<int> Rouges, vector<int> Bleus) {
    
    Positions[nbBlocs ++] = {- INFINI, 0};
    for (int a : Rouges)
        Positions[nbBlocs ++] = {(long long)a, 0};
    for (int a : Bleus)
        Positions[nbBlocs ++] = {(long long)a, 1};
    if (Positions[0].second != Positions[1].second)
        Positions[0].second ^= 1;
    
    sort(Positions, Positions + nbBlocs);
    
    for (int i = 1; i < nbBlocs; i ++)
    {
        PrefixSum[i] = PrefixSum[i - 1] + Positions[i].first;
    }
    
    int last = 1;
    
    for (int cur = 1; cur < nbBlocs; cur ++)
    {
        int next = cur;
        while (next < nbBlocs && Positions[cur].second == Positions[next].second)
            next ++;
        
        for (int i = last; i < cur; i ++)
        {
            DP[i] = min(DP[i], DP[i - 1] + Positions[cur].first - Positions[i].first);
        }
        
        long long coutTot = 0;
        long long mini = DP[cur - 1];
        
        for (int i = cur; i < next; i ++)
        {
            long long nb = i - cur + 1;
            coutTot += Positions[i].first - Positions[cur - 1].first;
            int prev = cur - 1 - nb;
            if (prev + 1 >= last)
            {
                mini = min(mini, DP[prev] + nb * Positions[cur - 1].first - PrefixSum[cur - 1] + PrefixSum[prev]);
            }
            DP[i] = coutTot + mini;
        }
        
        last = cur;
        cur = next - 1;
    }
    
	return DP[nbBlocs - 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...