#include "railroad.h"
#include<bits/stdc++.h>
#define ll long long
#define F first
#define S second
using namespace std;
const int maxn=1e9+10;
int dsu[4000010];
vector<int> s,t;
int f(int a){
if(dsu[a]==a)return a;
dsu[a]=f(dsu[a]);
return dsu[a];
}
bool onion(int a,int b){
a=f(a);
b=f(b);
if(a==b)return 0;
dsu[a]=b;
return 1;
}
ll plan_roller_coaster(vector<int> S, vector<int> T) {
int n = (int) S.size();
ll ans=0;
s=S,t=T;
vector<int> use;
s.push_back(maxn);
t.push_back(0);
for(int i=0;i<=n;i++){
use.push_back(t[i]);
use.push_back(s[i]);
}
sort(use.begin(),use.end());
use.erase(unique(use.begin(),use.end()),use.end());
int sz=use.size();
for(int i=0;i<sz;i++)dsu[i]=i;
for(int i=0;i<=n;i++){
t[i]=lower_bound(use.begin(),use.end(),t[i])-use.begin();
s[i]=lower_bound(use.begin(),use.end(),s[i])-use.begin();
onion(s[i],t[i]);
}
vector<int> ns=s,nt=t;
int cnt=0,spos=0,tpos=0;
sort(ns.begin(),ns.end());
sort(nt.begin(),nt.end());
for(int i=0;i<sz-1;i++){
while(spos<=n&&ns[spos]==i)cnt++,spos++;
while(tpos<=n&&nt[tpos]==i)cnt--,tpos++;
if(cnt<0){
onion(i,i+1);
}else if(cnt>0){
onion(i,i+1);
ans+=cnt*(ll)(use[i+1]-use[i]);
}
}
vector<pair<ll,pair<int,int>>> edge;
for(int i=0;i<sz-1;i++){
edge.push_back({use[i+1]-use[i],{i,i+1}});
}
sort(edge.begin(),edge.end());
for(auto x:edge){
if(onion(x.S.F,x.S.S)){
ans+=x.F;
}
}
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |