제출 #429138

#제출 시각아이디문제언어결과실행 시간메모리
429138AntekbRoller Coaster Railroad (IOI16_railroad)C++14
100 / 100
849 ms57504 KiB
#include "railroad.h" #include<bits/stdc++.h> #define st first #define nd second using namespace std; typedef long long ll; const int N=4e5+5; vector<int> E[N]; int r[N]; int find(int v){ if(r[v]==v)return v; return r[v]=find(r[v]); } void Union(int u, int v){ r[u]=v; } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { iota(r, r+N, 0); int n = (int) s.size(); n++; s.push_back(2e9); t.push_back(1); vector<pair<int, int> > V; unordered_map<int, int> M; int wsk=0; for(int i=0; i<n; i++){ if(M.find(t[i])==M.end())M[t[i]]=wsk++; if(M.find(s[i])==M.end())M[s[i]]=wsk++; V.push_back({s[i], -1}); V.push_back({t[i], 1}); //cout<<M[s[i]]<<" "<<M[t[i]]<<" "<<s[i]<<" "<<t[i]<<"\n"; E[M[s[i]]].push_back(M[t[i]]); E[M[t[i]]].push_back(M[s[i]]); } //cout<<"\n"; //for(auto i:M)cout<<i.st<<" "<<i.nd<<"\n"; //cout<<"\n"; sort(V.begin(), V.end()); long long ans=0; int ile=0; vector<pair<int, pair<int, int>>> edg; for(int i=0; i<V.size(); i++){ ile+=V[i].nd; if(ile<0 && V[i+1].st!=V[i].st){ E[M[V[i].st]].push_back(M[V[i+1].st]); E[M[V[i+1].st]].push_back(M[V[i].st]); ans+=-ile*(long long)(V[i+1].st-V[i].st); } if(ile>0 && V[i+1].st!=V[i].st){ E[M[V[i].st]].push_back(M[V[i+1].st]); E[M[V[i+1].st]].push_back(M[V[i].st]); } if(i+1<V.size() && V[i].st!=V[i+1].st){ edg.push_back({V[i+1].st-V[i].st, {M[V[i].st], M[V[i+1].st]}}); } } /*int cnt=1; for(int i=0; i<n; i++){ if(!vis[M[s[i]]])dfs(M[s[i]], wsk++); if(!vis[M[t[i]]])dfs(M[t[i]], wsk++); }*/ for(int i=0; i<wsk; i++){ for(int j:E[i]){ //cout<<i<<" "<<j<<"\n"; Union(find(i), find(j)); } } sort(edg.begin(), edg.end()); for(int i=0; i<edg.size(); i++){ int u=find(edg[i].nd.st), v=find(edg[i].nd.nd); if(u!=v){ ans+=edg[i].st; Union(u, v); } } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:42:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |     for(int i=0; i<V.size(); i++){
      |                  ~^~~~~~~~~
railroad.cpp:53:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |   if(i+1<V.size() && V[i].st!=V[i+1].st){
      |      ~~~^~~~~~~~~
railroad.cpp:69:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |     for(int i=0; i<edg.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...