제출 #1240961

#제출 시각아이디문제언어결과실행 시간메모리
1240961SalihSahin가장 긴 여행 (IOI23_longesttrip)C++20
70 / 100
6 ms428 KiB
#include "bits/stdc++.h" #include "longesttrip.h" #define pb push_back using namespace std; vector<int> longest_trip(int N, int D){ mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); if(D == 1){ vector<int> paths[2], p(N); for(int i = 0; i < N; i++){ p[i] = i; } shuffle(p.begin(), p.end(), rng); paths[0].pb(p[0]); paths[1].pb(p[1]); for(int i = 2; i < N; i++){ bool c1 = are_connected({p[i]}, {paths[0].back()}); if(c1){ paths[0].pb(p[i]); continue; } bool c2 = are_connected({p[i]}, {paths[1].back()}); if(c2){ paths[1].pb(p[i]); continue; } while(paths[1].size()){ paths[0].pb(paths[1].back()); paths[1].pop_back(); } paths[1].pb(p[i]); } bool check = are_connected(paths[0], paths[1]); if(paths[1].size() > paths[0].size()) swap(paths[0], paths[1]); if(!check){ return paths[0]; } else{ if(paths[1].size() == 1){ // bu if buglı int a = paths[0][0], b = paths[0].back(), c = paths[1][0]; bool c3 = 0; bool c2 = are_connected({b}, {c}); if(c2){ paths[0].pb(c); return paths[0]; } else{ c3 = are_connected({c}, {a}); } if(c3){ reverse(paths[0].begin(), paths[0].end()); paths[0].pb(c); return paths[0]; } int l = 0, r = paths[0].size()-1; while(l < r){ int m = (l + r)/2; vector<int> v; for(int i = 0; i <= m; i++){ v.pb(paths[0][i]); } bool check = are_connected(v, {c}); if(check) r = m; else l = m+1; } int x = paths[0][l]; vector<int> updpath; for(auto itr: paths[0]){ updpath.pb(itr); if(itr == x) break; } updpath.pb(c); reverse(updpath.begin(), updpath.end()); reverse(paths[0].begin(), paths[0].end()); for(auto itr: paths[0]){ if(itr == x) break; updpath.pb(itr); } return updpath; } else{ int a = paths[0][0], b = paths[0].back(), c = paths[1][0], d = paths[1].back(); bool c2 = are_connected({b}, {c}); bool c3 = 0; if(c2){ vector<int> v = paths[0]; for(auto itr: paths[1]) v.pb(itr); return v; } else{ c3 = are_connected({c}, {a}); } if(c3){ vector<int> v = paths[0]; reverse(v.begin(), v.end()); for(auto itr: paths[1]) v.pb(itr); return v; } bool c5 = are_connected({a}, {d}); bool c6 = 0; if(c5){ vector<int> v = paths[0]; reverse(v.begin(), v.end()); reverse(paths[1].begin(), paths[1].end()); for(auto itr: paths[1]) v.pb(itr); return v; } else{ c6 = are_connected({b}, {d}); } if(c6){ vector<int> v = paths[1]; reverse(paths[0].begin(), paths[0].end()); for(auto itr: paths[0]) v.pb(itr); return v; } // şimdi ikisinin de cycle olduğunu biliyoruz pair<int, int> p = {-1, -1}; int l = 0, r = paths[1].size()-1; while(l < r){ int m = (l + r)/2; vector<int> v; for(int i = 0; i <= m; i++){ v.pb(paths[1][i]); } bool check = are_connected(paths[0], v); if(check) r = m; else l = m+1; } int sec = paths[1][l]; l = 0, r = paths[0].size()-1; while(l < r){ int m = (l + r)/2; vector<int> v; for(int i = 0; i <= m; i++){ v.pb(paths[0][i]); } bool check = are_connected({sec}, v); if(check) r = m; else l = m+1; } int fir = paths[0][l]; p = {fir, sec}; vector<int> ans; for(auto itr: paths[0]){ if(itr == p.first) break; ans.pb(itr); } reverse(ans.begin(), ans.end()); reverse(paths[0].begin(), paths[0].end()); for(auto itr: paths[0]){ ans.pb(itr); if(itr == p.first) break; } // son eleman p.first vector<int> ans2; for(auto itr: paths[1]){ if(itr == p.second) break; ans2.pb(itr); } reverse(ans2.begin(), ans2.end()); reverse(paths[1].begin(), paths[1].end()); for(auto itr: paths[1]){ ans2.pb(itr); if(itr == p.second) break; } // son eleman p.second vector<int> v = ans; reverse(ans2.begin(), ans2.end()); for(auto itr: ans2) v.pb(itr); return v; } } } return {}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...