제출 #733332

#제출 시각아이디문제언어결과실행 시간메모리
733332t6twotwoWiring (IOI17_wiring)C++17
100 / 100
40 ms7068 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr ll inf = 1E16;
long long min_total_length(vector<int> R, vector<int> B) {
    int N = R.size();
    int M = B.size();
    vector<array<int, 2>> T;
    for (int i = 0, j = 0; i < N || j < M;) {
        if (i < N && (j == M || R[i] < B[j])) {
            T.push_back({R[i++], 0});
        } else {
            T.push_back({B[j++], 1});
        }
    }
    vector<ll> dp(N + M + 1, inf);
    dp[0] = 0;
    for (int i = 0, j = 0, k = 0; j < N + M; i = j, j = k) {
        while (k < N + M && T[k][1] == T[j][1]) {
            k++;
        }
        for (int p = i; p < j; p++) {
            dp[p + 1] = min(dp[p + 1], dp[p] + T[j][0] - T[p][0]);
        }
        ll s = 0;
        for (int p = 0; j + p < k && j - 1 - p >= i; p++) {
            s += T[j + p][0] - T[j - 1 - p][0];
            dp[j + p + 1] = min(dp[j + p + 1], dp[j - 1 - p] + s);
        }
        if (j > 0) {
            for (int p = j; p < k; p++) {
                dp[p + 1] = min(dp[p + 1], dp[p] + T[p][0] - T[j - 1][0]);
            }
        }
    }
    return dp[N + M];
}
#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...