Submission #1256271

#TimeUsernameProblemLanguageResultExecution timeMemory
1256271biankRoller Coaster Railroad (IOI16_railroad)C++20
100 / 100
132 ms13328 KiB
#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)

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

using ii = pair<int, int>;
using vi = vector<int>;
using ll = long long;
using vll = vector<ll>;

#define fst first
#define snd second

#define pb push_back
#define eb emplace_back

const int INF = 1e9 + 9;

struct DSU {
    vi p;
    DSU(int n) : p(n, -1) {}
    int find(int x) {
        if (p[x] < 0) return x;
        return p[x] = find(p[x]);
    }
    bool unite(int x, int y) {
        x = find(x), y = find(y);
        if (x == y) return false;
        if (p[x] > p[y]) swap(x, y);
        p[x] += p[y], p[y] = x;
        return true;
    }
};

ll plan_roller_coaster(vi s, vi t) {
    s.pb(INF), t.pb(1);
    int n = sz(s);
    vi vals = s;
    forn(i, n) vals.pb(t[i]);
    sort(all(vals));
    vals.erase(unique(all(vals)), end(vals));
    auto pos = [&](int x) {
        return int(lower_bound(all(vals), x) - begin(vals));
    };
    forn(i, n) s[i] = pos(s[i]), t[i] = pos(t[i]);
    const int m = sz(vals);
    DSU dsu(m);
    forn(i, n) dsu.unite(s[i], t[i]);
    vi delta(m);
    forn(i, n) delta[s[i]]++, delta[t[i]]--;
    vector<pair<ll, int>> edges;
    ll pref = 0LL, ret = 0LL;
    forn(i, m - 1) {
        int dist = vals[i + 1] - vals[i];
        pref += delta[i];
        ret += max(0LL, pref) * dist;
        if (pref != 0LL) dsu.unite(i, i + 1);
        else edges.eb(dist, i);
    }
    sort(all(edges));
    for (auto [w, i] : edges) {
        if (dsu.unite(i, i + 1)) ret += w;
    }
    return ret;
}

Compilation message (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...