#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = 1'000'000'001;
// int main() {
// int n;
// assert(1 == scanf("%d", &n));
// std::vector<int> s(n), t(n);
// for (int i = 0; i < n; ++i)
// assert(2 == scanf("%d%d", &s[i], &t[i]));
// long long ans = plan_roller_coaster(s, t);
// printf("%lld\n", ans);
// return 0;
// }
void build(int n, vector<pair<int,int>> &in, int &len, vector<int> &seg) {
len = 2 << __lg(n);
seg.resize(2*len,INF);
for (int i{0};i<n;i++) {
seg[len+i] = in[i].first;
}
for (int i{len-1};i>=1;i--) {
seg[i] = min(seg[2*i],seg[2*i+1]);
}
}
void update(int len, vector<int> &seg,int i, int v) {
i += len;
seg[i] = v;
for (i/=2;i>=1;i/=2) {
seg[i] = min(seg[2*i],seg[2*i+1]);
}
}
int fmin(int len, vector<int> &seg) {
int i = 1;
while (i < len) {
if (seg[2*i] < seg[2*i + 1]) {
i = 2*i;
}
else {
i = 2*i + 1;
}
}
return i - len;
}
int search(int len, vector<int> &seg, int v) {
int i = 1;
while (i < len) {
if (seg[i] <= v) {
if (seg[2*i+1] <= v) {
i = 2*i+1;
}
else {
i = 2*i;
}
}
else {
if (seg[2*i] <= seg[2*i+1]) {
i = 2*i;
}
else {
i = 2*i+1;
}
}
}
return i - len;
}
// int search(int n, vector<pair<int,int>> &v, int w) {
// int l = 0;
// int r = n-1;
// while (r >= l) {
// int i = (l+r)/2;
// if (v[i].first == w) {
// return v[i].second;
// }
// if (v[i].first > w) {
// r = i-1;
// }
// else {
// l = i+1;
// }
// }
// return v[r+1].second;
// }
long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
int n = (int) s.size()+1;
s.push_back(INF);
t.push_back(0);
// int len1{};
// int len2{};
// vector<int> seg1{};
// vector<int> seg2{};
// build(n,s,len1,seg1);
// build(n,t,len2,seg2);
vector<pair<int,int>> ss(n);
vector<pair<int,int>> tt(n);
for (int i{0};i<n;++i) {
ss[i] = {s[i],i};
tt[i] = {t[i],i};
}
sort(ss.begin(),ss.end());
sort(tt.begin(),tt.end());
vector<int> si(n);
vector<int> ti(n);
for (int i{0};i<n;++i) {
si[ss[i].second] = i;
ti[tt[i].second] = i;
}
int len1{};
int len2{};
vector<int> seg1{};
vector<int> seg2{};
build(n,ss,len1,seg1);
build(n,tt,len2,seg2);
int out = 0;
for (int i{1};i<n;++i) {
// cout << s[i] << " " << t[i] << "\n";
// int a = fmin(len1,seg1);
// update(len1,seg1,a,INF);
// update(len2,seg2,a,INF);
// int b = fmin(len2,seg2);
// out += max(0,t[b]-s[a]);
// update(len2,seg2,b,t[a]);
// t[b] = t[a];
// s[a] = INF;
// t[a] = INF;
int a = ss[search(len1,seg1,0)].second;
update(len1,seg1,si[a],INF);
update(len2,seg2,ti[a],INF);
int b = tt[search(len2,seg2,s[a])].second;
out += max(0,t[b]-s[a]);
update(len2,seg2,ti[b],t[a]);
t[b] = t[a];
tt[b].first = tt[a].first;
}
return out;
}
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... |