Submission #1283587

#TimeUsernameProblemLanguageResultExecution timeMemory
1283587stanwaibbangeRoller Coaster Railroad (IOI16_railroad)C++20
30 / 100
180 ms12376 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...