#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<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];
}
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;
}
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);
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;
}
return out;
}
컴파일 시 표준 에러 (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... |