Submission #610526

#TimeUsernameProblemLanguageResultExecution timeMemory
610526alirezasamimi100Roller Coaster Railroad (IOI16_railroad)C++17
100 / 100
278 ms25100 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
using pll = pair<ll,ll>;
#define pb push_back
#define F first
#define S second

vector<ll> cp,ps,p;
vector<pll> vec;
int n;
ll ans;

ll gp(ll x){
    return p[x]==-1?x:p[x]=gp(p[x]);
}

bool uni(ll v, ll u){
    v=gp(v);
    u=gp(u);
    if(v==u) return false;
    p[u]=v;
    return true;
}

ll plan_roller_coaster(vector<int> s, vector<int> t) {
    s.pb(1e9+10);
    t.pb(1);
    for(int i=0; i<(int)s.size(); i++){
        cp.pb(s[i]);
        cp.pb(t[i]);
    }
    sort(cp.begin(),cp.end());
    cp.resize(unique(cp.begin(),cp.end())-cp.begin());
    n=cp.size();
    ps.resize(n);
    p.resize(n,-1);
    for(int i=0; i<(int)s.size(); i++){
        s[i]=lower_bound(cp.begin(),cp.end(),s[i])-cp.begin();
        t[i]=lower_bound(cp.begin(),cp.end(),t[i])-cp.begin();
        uni(s[i],t[i]);
        ps[s[i]]++;
        ps[t[i]]--;
    }
    for(int i=1; i<n; i++) ps[i]+=ps[i-1];
    for(int i=0; i<n-1; i++){
        if(ps[i]){
            uni(i,i+1);
            if(ps[i]>0) ans+=ps[i]*(cp[i+1]-cp[i]);
        }
        vec.pb({cp[i+1]-cp[i],i});
    }
    sort(vec.begin(),vec.end());
    for(auto [w,i] : vec) if(uni(i,i+1)) ans+=w;
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...