Submission #1041519

#TimeUsernameProblemLanguageResultExecution timeMemory
1041519pccRoller Coaster Railroad (IOI16_railroad)C++17
100 / 100
117 ms23488 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define fs first #define sc second #define pll pair<ll,ll> #define _all(T) T.begin(),T.end() #define tiii tuple<int,int,int> const ll inf = 1e9+10; const int mxn = 2e5+10; struct DSU{ int dsu[mxn*3],sz[mxn*3]; void init(int n){ iota(dsu,dsu+n,0); fill(sz,sz+n,1); } int root(int k){return k== dsu[k]?k:dsu[k] = root(dsu[k]);} void onion(int a,int b){ a = root(a),b = root(b); if(a == b)return; if(sz[a]<sz[b])swap(a,b); sz[a] += sz[b]; dsu[b] = a; return; } DSU(){} }; DSU dsu; vector<int> all; int deg[mxn*3]; int in[mxn*3],out[mxn*3]; vector<tuple<int,int,int>> edges; long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { ll ans = 0; int N = (int)s.size(); all.push_back(0); for(int i = 0;i<N;i++){ all.push_back(s[i]); all.push_back(t[i]); } all.push_back(inf); sort(_all(all));all.erase(unique(_all(all)),all.end()); dsu.init(all.size()); for(int i = 0;i<N;i++){ s[i] = lower_bound(_all(all),s[i])-all.begin(); t[i] = lower_bound(_all(all),t[i])-all.begin(); out[s[i]]++; in[t[i]]++; dsu.onion(s[i],t[i]); } in[0]++;out[all.size()-1]++; for(int i = 0;i<all.size();i++){ if(i != all.size()-1||in[i] == out[i]); if(in[i] == out[i])continue; else if(in[i]<out[i]){ int d = out[i]-in[i]; ans += 1ll*(all[i+1]-all[i])*d; in[i] += d; out[i+1] += d; dsu.onion(i,i+1); } else{ int d = in[i]-out[i]; out[i] += d; in[i+1] += d; dsu.onion(i,i+1); } } for(int i = 1;i<all.size();i++){ if(dsu.root(i) != dsu.root(i-1)){ edges.push_back(tiii(all[i]-all[i-1],i,i-1)); } } sort(edges.begin(),edges.end()); for(auto &[w,a,b]:edges){ if(dsu.root(a) != dsu.root(b)){ dsu.onion(a,b); ans += w; } } return ans; }

Compilation message (stderr)

railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:59:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |  for(int i = 0;i<all.size();i++){
      |                ~^~~~~~~~~~~
railroad.cpp:60:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |   if(i != all.size()-1||in[i] == out[i]);
      |      ~~^~~~~~~~~~~~~~~
railroad.cpp:76:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |  for(int i = 1;i<all.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...