Submission #1218685

#TimeUsernameProblemLanguageResultExecution timeMemory
1218685JooDdaeRoller Coaster Railroad (IOI16_railroad)C++20
30 / 100
178 ms20520 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int p[400400];

int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
int merge(int x, int y) {
    if((x = find(x)) == (y = find(y))) return 0;
    p[x] = y;
    return 1;
}

ll plan_roller_coaster(vector<int> s, vector<int> t) {
    s.push_back(1e9), t.push_back(1);
    int n = s.size();
    vector<int> V;
    for(int i=0;i<n;i++) V.push_back(s[i]), V.push_back(t[i]);
    sort(V.begin(), V.end());
    V.erase(unique(V.begin(), V.end()), V.end());

    for(int i=0;i<n;i++) s[i] = lower_bound(V.begin(), V.end(), s[i]) - V.begin() + 1;
    for(int i=0;i<n;i++) t[i] = lower_bound(V.begin(), V.end(), t[i]) - V.begin() + 1;
    vector<array<int, 3>> e;

    int m = V.size();
    vector<int> S(m+1, 0);
    for(int i=0;i<n;i++) S[s[i]]++, S[t[i]]--, e.push_back({0, s[i], t[i]});
    ll ans = 0;
    for(int i=1;i<m;i++) {
        S[i] += S[i-1];
        if(S[i] > 0) ans += (V[i]-V[i-1]) * S[i];
        e.push_back({S[i] ? 0 : 2*(V[i]-V[i-1]), i, i+1});
    }

    iota(p+1, p+1+m, 1);
    sort(e.begin(), e.end());
    for(auto [z, x, y] : e) if(merge(x, y)) ans += z;

    return ans;
}

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...