제출 #1231588

#제출 시각아이디문제언어결과실행 시간메모리
1231588LIARoller Coaster Railroad (IOI16_railroad)C++17
100 / 100
185 ms15936 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

struct DSU {
    vector<int> p, r;
    DSU(int n) : p(n), r(n) { iota(p.begin(), p.end(), 0); }
    int find(int a) { return p[a] == a ? a : p[a] = find(p[a]); }
    bool unite(int a, int b) {
        a = find(a); b = find(b);
        if (a == b) return false;
        if (r[a] < r[b]) swap(a, b);
        p[b] = a;
        if (r[a] == r[b]) r[a]++;
        return true;
    }
};

ll plan_roller_coaster(vector<int> s, vector<int> t) {
    int n = s.size();
    vector<int> xs;
    xs.reserve(2 * n + 1);
    xs.push_back(1);                      
    for (int v : s) xs.push_back(v);
    for (int v : t) xs.push_back(v);
    sort(xs.begin(), xs.end());
    xs.erase(unique(xs.begin(), xs.end()), xs.end());
    int m = xs.size();

    vector<ll> diff(m + 1);
    for (int i = 0; i < n; i++) {
        int a = lower_bound(xs.begin(), xs.end(), s[i]) - xs.begin();
        int b = lower_bound(xs.begin(), xs.end(), t[i]) - xs.begin();
        diff[b]--;
        diff[a]++;
    }
    int idx1 = lower_bound(xs.begin(), xs.end(), 1) - xs.begin();
    diff[idx1]--;                         

    vector<ll> bal(m - 1);
    ll cur = 0;
    for (int i = 0; i < m - 1; i++) {
        cur += diff[i];
        bal[i] = cur;
    }

    ll cost1 = 0;
    for (int i = 0; i < m - 1; i++) {
        if (bal[i] > 0) cost1 += bal[i] * (xs[i + 1] - xs[i]);
    }

    DSU dsu(m);
    for (int i = 0; i < n; i++) {
        int a = lower_bound(xs.begin(), xs.end(), s[i]) - xs.begin();
        int b = lower_bound(xs.begin(), xs.end(), t[i]) - xs.begin();
        dsu.unite(a, b);
    }
    for (int i = 0; i < m - 1; i++) {
        if (bal[i] != 0) {
            dsu.unite(i, i + 1);
        }
    }

    vector<pair<int,int>> segs;
    segs.reserve(m - 1);
    for (int i = 0; i < m - 1; i++) {
        if (bal[i] == 0) segs.emplace_back(xs[i + 1] - xs[i], i);
    }
    sort(segs.begin(), segs.end());

    ll cost2 = 0;
    for (auto &pr : segs) {
        int idx = pr.second;
        if (dsu.unite(idx, idx + 1)) cost2 += pr.first;
    }

    return cost1 + cost2;
}

컴파일 시 표준 에러 (stderr) 메시지

railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...