이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "railroad.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define all(x) (x).begin() , (x).end()
#define SZ(x) int(x.size())
#define sep ' '
#define X first
#define Y second
const int MAXN = 5e5 + 10;
ll ps[MAXN] , par[MAXN] , sz[MAXN];
vector<ll> compress;
int Find(int v){
return (par[v] == -1 ? v : par[v] = Find(par[v]));
}
void Union(int v , int u){
// cout << "U " << v << sep << u << endl;
v = Find(v); u = Find(u);
if(v == u) return;
if(sz[v] < sz[u]) swap(v , u);
par[v] = u;
sz[v] += sz[u];
}
ll plan_roller_coaster(vector<int> s, vector<int> t) {
fill(par , par + MAXN , -1);
fill(sz , sz + MAXN , 1);
int n = (int) s.size();
for(int i = 0 ; i < n ; i++){
compress.push_back(s[i]);
compress.push_back(t[i]);
}
sort(all(compress));
compress.resize(unique(all(compress)) - compress.begin());
for(int i = 0 ; i < n ; i++){
// cout << s[i] << sep << t[i] << endl;
s[i] = lower_bound(all(compress) , s[i]) - compress.begin();
t[i] = lower_bound(all(compress) , t[i]) - compress.begin();
ps[s[i]]++; ps[t[i]]--; Union(s[i] , t[i]);
// cout << s[i] << sep << t[i] << endl;
}
ll ans = 0;
vector<pii> vec;
for(int i = 0 ; i + 1 < SZ(compress) ; i++){
ps[i + 1] += ps[i];
ans += max(0ll , ps[i] - 1) * (compress[i + 1] - compress[i]);
if(ps[i] != 1) Union(i , i + 1);
else{
vec.push_back({compress[i + 1] - compress[i] , i});
}
}
sort(all(vec));
for(pii i : vec){
// cout << "E " << i.X << sep << i.Y << endl;
if(Find(i.Y) != Find(i.Y + 1)){
Union(i.Y , i.Y + 1);
ans += i.X;
}
}
return ans;
}
# | 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... |