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