Submission #1130926

#TimeUsernameProblemLanguageResultExecution timeMemory
1130926yellowtoadRoller Coaster Railroad (IOI16_railroad)C++20
100 / 100
438 ms43592 KiB
#include "railroad.h" #include <iostream> #include <algorithm> #include <map> using namespace std; long long d[400010], ans, cnt, p[400010]; vector<int> discrete; vector<pair<long long,pair<int,int>>> edge; map<int,int> mp; int dsu(int u) { if (p[u] == u) return u; return p[u] = dsu(p[u]); } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { s.push_back(1e9); t.push_back(1); int n = (int) s.size(); for (int i = 0; i < n; i++) { discrete.push_back(s[i]); discrete.push_back(t[i]); } sort(discrete.begin(),discrete.end()); for (int i = 0; i < discrete.size(); i++) mp[discrete[i]] = i; for (int i = 0; i < n; i++) { int u = mp[s[i]], v = mp[t[i]]; d[u]--; d[v]++; edge.push_back({0,{u,v}}); } for (int i = 0; i < (int)discrete.size()-1; i++) { cnt += d[i]; if (cnt < 0) ans += (-cnt)*(discrete[i+1]-discrete[i]); if (cnt) edge.push_back({0,{i,i+1}}); else edge.push_back({discrete[i+1]-discrete[i],{i,i+1}}); } sort(edge.begin(),edge.end()); for (int i = 0; i < discrete.size(); i++) p[i] = i; for (int i = 0; i < edge.size(); i++) { long long w = edge[i].first, u = edge[i].second.first, v = edge[i].second.second; if (dsu(u) != dsu(v)) { p[dsu(u)] = p[dsu(v)]; ans += w; } } 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...