Submission #1238602

#TimeUsernameProblemLanguageResultExecution timeMemory
1238602Zbyszek99Roller Coaster Railroad (IOI16_railroad)C++20
0 / 100
416 ms30084 KiB
#include "railroad.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9; ll rel_val[400005]; int in_[400005]; int out_[400005]; int rep_[400005]; int fint(int v) { if(rep_[v] == v) return v; rep_[v] = fint(rep_[v]); return rep_[v]; } void onion(int a, int b) { rep_[fint(a)] = fint(b); } ll plan_roller_coaster(vi s, vi t) { int n = siz(s)+1; s.pb(1); t.pb(1e9); ll ans = 0; map<int,int> m; rep(i,n) { m[s[i]] = 1; m[t[i]] = 1; } int cur = 0; forall(it,m) { rel_val[cur] = it.ff; m[it.ff] = cur++; } rep(i,n) { s[i] = m[s[i]]; t[i] = m[t[i]]; } rep(i,cur) rep_[i] = i; rep(i,n) { onion(s[i],t[i]); in_[t[i]]++; out_[s[i]]++; } int bal = 0; rep(j,cur) { bal -= in_[j]; bal += out_[j]; if(bal > 0) { onion(j,j+1); ans += bal * (rel_val[j+1] - rel_val[j]); bal--; } else if(bal < 0) { onion(j,j+1); bal--; } } vector<pair<ll,pii>> edges; rep(j,cur-1) { if(fint(j) != fint(j+1)) { edges.pb({rel_val[j+1]-rel_val[j],{j,j+1}}); } } sort(all(edges)); forall(it,edges) { if(fint(it.ss.ff) != fint(it.ss.ss)) { ans += it.ff; onion(it.ss.ff,it.ss.ss); } } return ans; }

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...