Submission #32064

#TimeUsernameProblemLanguageResultExecution timeMemory
32064imeimi2000Roller Coaster Railroad (IOI16_railroad)C++14
30 / 100
416 ms48732 KiB
#include "railroad.h" #include <algorithm> using namespace std; typedef long long llong; typedef pair<int, int> pi; int n; vector<int> comp; int bsearch(int x) { int s = 0, e = comp.size() - 1, m; while (s < e) { m = (s + e) / 2; if (comp[m] == x) return m; if (comp[m] < x) s = m + 1; else e = m - 1; } return s; } int degree[400000]; int group[400000]; int par[400000]; vector<int> edge[400000]; pi mst[400000]; void dfs(int x, int s) { group[x] = s; for (int i : edge[x]) { if (group[i] > 0) continue; dfs(i, s); } } int find(int x) { if (par[x]) return par[x] = find(par[x]); return x; } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { n = s.size(); comp.resize(n << 1); for (int i = 0; i < n; ++i) { comp[i << 1] = s[i]; comp[i << 1 | 1] = t[i]; } sort(comp.begin(), comp.end()); comp.erase(unique(comp.begin(), comp.end()), comp.end()); for (int i = 0; i < n; ++i) { s[i] = bsearch(s[i]); t[i] = bsearch(t[i]); ++degree[s[i]]; --degree[t[i]]; edge[s[i]].push_back(t[i]); } int need; llong ans = 0ll; for (int i = 0; i + 1 < comp.size(); ++i) { need = (i == 0) - degree[i]; degree[i + 1] -= need; degree[i] += need; if (need > 0) { edge[i].push_back(i + 1); } else if (need < 0) { edge[i + 1].push_back(i); ans -= 1ll * need * (comp[i + 1] - comp[i]); } } int j = 0; for (int i = 0; i < comp.size(); ++i) { if (group[i]) continue; dfs(i, ++j); } for (int i = 0, j = 0; i + 1 < comp.size(); ++i) { if (group[i] != group[i + 1]) { mst[j++] = { comp[i + 1] - comp[i], i }; } } sort(mst, mst + j); for (int i = 0; i < j; ++i) { int x = find(group[mst[i].second]), y = find(group[mst[i].second + 1]); if (x == y) continue; ans += mst[i].first; par[x] = y; } return ans; }

Compilation message (stderr)

railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:58:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i + 1 < comp.size(); ++i) {
                        ^
railroad.cpp:71:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < comp.size(); ++i) {
                    ^
railroad.cpp:75:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0, j = 0; i + 1 < comp.size(); ++i) {
                               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...