Submission #1007946

#TimeUsernameProblemLanguageResultExecution timeMemory
1007946bachhoangxuanRoller Coaster Railroad (IOI16_railroad)C++17
100 / 100
187 ms19116 KiB
#include "railroad.h"
#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9;

long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
    long long res=0;
    vector<int> com;
    s.push_back(inf);
    t.push_back(0);
    int n=(int)s.size();
    for(int i=0;i<n;i++) com.push_back(s[i]),com.push_back(t[i]);
    sort(com.begin(),com.end());
    com.erase(unique(com.begin(),com.end()),com.end());
    int sz=(int)com.size();
    vector<int> cnt(sz),par(sz);
    iota(par.begin(),par.end(),0);
    function<int(int)> findpar = [&](int u){
        if(u!=par[u]) return par[u]=findpar(par[u]);
        return u;
    };
    auto unions = [&](int u,int v){
        u=findpar(u);v=findpar(v);
        if(u!=v) par[v]=u;
        return (u!=v);
    };
    for(int i=0;i<n;i++){
        int l=lower_bound(com.begin(),com.end(),s[i])-com.begin();
        int r=lower_bound(com.begin(),com.end(),t[i])-com.begin();
        cnt[l]++;cnt[r]--;unions(l,r);
    }
    for(int i=1;i<sz;i++){
        cnt[i]+=cnt[i-1];
        if(cnt[i-1]){
            unions(i-1,i);
            if(cnt[i-1]>0) res+=1LL*cnt[i-1]*(com[i]-com[i-1]);
        }
    }
    vector<pair<int,int>> e;
    for(int i=1;i<sz;i++) e.push_back({com[i]-com[i-1],i});
    sort(e.begin(),e.end());
    for(auto [x,i]:e) if(unions(i-1,i)) res+=x;
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...