제출 #1307998

#제출 시각아이디문제언어결과실행 시간메모리
1307998biank전선 연결 (IOI17_wiring)C++20
100 / 100
25 ms5804 KiB
#include "wiring.h"
#include <bits/stdc++.h>
 
using namespace std;
 
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
 
using vi = vector<int>;
using ii = pair<int, int>;
using vii = vector<ii>;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using vb = vector<bool>;
using pll = pair<ll, ll>;

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
#define sum(x) accumulate(all(x), 0LL)

#define pb push_back
#define eb emplace_back

#define fst first
#define snd second

const ll INF = 1e18;

vector<vi> buildSegments(const vi &r, const vi &b) {
    vector<vi> g;
    bool last = false;
    const int n = sz(r), m = sz(b);
    int i = 0, j = 0;
    while (i < n || j < m) {
        if (j == m || (i < n && r[i] < b[j])) {
            if (g.empty() || last) g.eb();
            g.back().pb(r[i++]), last = 0;
        } else {
            if (g.empty() || !last) g.eb();
            g.back().pb(b[j++]), last = 1;
        }
    }
    return g;
}

vll calcDP(const vll &prev, const vi &a, const vi &b) {
    const int n = sz(a), m = sz(b);
    vll pref(n + 1), suff(n + 1);
    ll sum = 0, dist = b.front() - a.back();
    forn(i, n + 1) {
        pref[i] = prev[n - i] + sum;
        suff[i] = pref[i] + i * dist;
        if (i < n) sum += a.back() - a[n - 1 - i];
    }
    forsn(i, 1, n + 1) pref[i] = min(pref[i], pref[i - 1]);
    dforn(i, n) suff[i] = min(suff[i], suff[i + 1]);
    vll dp(m + 1);
    sum = 0;
    forn(i, m + 1) {
        dp[i] = pref[min(i, n)] + sum + i * dist;
        if (i <= n) dp[i] = min(dp[i], suff[i] + sum);
        if (i < m) sum += b[i] - b.front();
    }
    return dp;
}

ll min_total_length(vi r, vi b) {
    vector<vi> g = buildSegments(r, b);
    assert(sz(g) >= 2);
    vll dp(sz(g[0]) + 1, INF);
    dp[0] = 0;
    forsn(i, 1, sz(g)) dp = calcDP(dp, g[i - 1], g[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...