Submission #1203742

#TimeUsernameProblemLanguageResultExecution timeMemory
1203742onbertRoller Coaster Railroad (IOI16_railroad)C++20
100 / 100
281 ms62384 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; #define int long long const int INF = 1e9; const int maxn = 4e5 + 5; int sz; vector<int> vals = {-INF}; int dc(int x) {return lower_bound(vals.begin(), vals.end(), x) - vals.begin();} int n; vector<int> adj[maxn]; int sum[maxn]; int dsu[maxn]; int rt(int u) { if (dsu[u] == u) return u; return dsu[u] = rt(dsu[u]); } void merge(int u, int v) { u = rt(u), v = rt(v); if (u != v) dsu[u] = v; } bool vis[maxn]; void dfs(int u, int RT) { vis[u] = true; merge(u, RT); for (int v:adj[u]) if (!vis[v]) dfs(v, RT); } long long plan_roller_coaster(vector<int32_t> s, vector<int32_t> t) { s.push_back(INF); t.push_back(1); n = s.size(); for (int i=0;i<n;i++) { vals.push_back(s[i]); vals.push_back(t[i]); } sort(vals.begin(), vals.end()); vals.erase(unique(vals.begin(), vals.end()), vals.end()); sz = vals.size() - 1; for (int i=0;i<n;i++) s[i] = dc(s[i]), t[i] = dc(t[i]); for (int i=0;i<n;i++) adj[s[i]].push_back(t[i]); for (int i=0;i<n;i++) sum[s[i]]++, sum[t[i]]--; int ans = 0; for (int i=sz;i>=1;i--) { if (sum[i] < 0) { adj[i].push_back(i-1); ans -= sum[i] * (vals[i] - vals[i-1]); } else if (sum[i] > 0) adj[i-1].push_back(i); sum[i-1] += sum[i]; } for (int i=1;i<=sz;i++) dsu[i] = i; for (int i=1;i<=sz;i++) if (!vis[i]) dfs(i, i); // for (int i=1;i<=sz;i++) cout << rt(i) << " "; cout << endl; vector<pair<int,int>> vec; for (int i=1;i<sz;i++) vec.push_back({vals[i+1] - vals[i], i}); sort(vec.begin(), vec.end()); for (auto [x, i]:vec) if (rt(i) != rt(i+1)) { // cout << x << " " << i << endl; merge(i, i+1); ans += x; } 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...