제출 #846744

#제출 시각아이디문제언어결과실행 시간메모리
846744IvanJ가장 긴 여행 (IOI23_longesttrip)C++17
100 / 100
10 ms856 KiB
#include "longesttrip.h" #include<bits/stdc++.h> #define pb push_back #define all(a) (a).begin(), (a).end() using namespace std; vector<int> longest_trip(int n, int D) { if(D == 3) { vector<int> p; for(int i = 0;i < n;i++) p.pb(i); return p; } if(D == 2) { deque<int> dq; if(!are_connected({0}, {1})) dq.pb(0), dq.pb(2), dq.pb(1); else if(!are_connected({1}, {2})) dq.pb(1), dq.pb(0), dq.pb(2); else dq.pb(0), dq.pb(1), dq.pb(2); for(int i = 3;i < n;i++) { if(are_connected({i}, {dq.front()})) dq.push_front(i); else dq.pb(i); } return vector<int>(all(dq)); } if(D == 1) { vector<int> p1, p2; if(n & 1) p1.pb(n - 1); for(int i = 1;i < n;i += 2) { int a = i - 1, b = i; if(p2.size()) { int c = p1.back(), d = p2.back(); if(are_connected({a}, {b})) { if(are_connected({a}, {c})) { p1.pb(a), p1.pb(b); if(are_connected({b}, {d})) { while(p2.size()) p1.pb(p2.back()), p2.pop_back(); } } else { p2.pb(a), p2.pb(b); if(are_connected({b}, {c})) { while(p1.size()) p2.pb(p1.back()), p1.pop_back(); } } } else { if(are_connected({a}, {c})) { if(are_connected({b}, {d})) p1.pb(a), p2.pb(b); else p1.pb(b), p2.pb(a); } else p1.pb(b), p2.pb(a); } } else { if(are_connected({a}, {b})) { if(p1.size() == 0) p1.pb(a), p1.pb(b); else if(are_connected({a}, {p1.back()})) { p1.pb(a), p1.pb(b); } else { if(are_connected({b}, {p1.back()})) p1.pb(b), p1.pb(a); else p2.pb(a), p2.pb(b); } } else { if(p1.size() == 0) p1.pb(a), p2.pb(b); else if(are_connected({a}, {p1.back()})) p1.pb(a), p2.pb(b); else p1.pb(b), p2.pb(a); } } if(p1.size() < p2.size()) swap(p1, p2); } if((int)p1.size() == n) return p1; if(!are_connected(p1, p2)) return p1; if(are_connected({p1.back()}, {p2[0]})) { vector<int> p = p1; for(int i : p2) p.pb(i); return p; } if(are_connected({p2.back()}, {p1[0]})) { vector<int> p = p2; for(int i : p1) p.pb(i); return p; } vector<int> v = p1; while(v.size() > 1) { int mid = (int)v.size() / 2; vector<int> v1, v2; for(int i = 0;i < mid;i++) v1.pb(v[i]); for(int i = mid;i < (int)v.size();i++) v2.pb(v[i]); if(are_connected(v1, p2)) v = v1; else v = v2; } int X = v[0]; v = p2; while(v.size() > 1) { int mid = (int)v.size() / 2; vector<int> v1, v2; for(int i = 0;i < mid;i++) v1.pb(v[i]); for(int i = mid;i < (int)v.size();i++) v2.pb(v[i]); if(are_connected({X}, v1)) v = v1; else v = v2; } int Y = v[0]; vector<int> p; int pos1 = -1, pos2 = -1; for(int i = 0;i < (int)p1.size();i++) if(p1[i] == X) pos1 = i; for(int i = 0;i < (int)p2.size();i++) if(p2[i] == Y) pos2 = i; for(int i = 0;i < (int)p1.size();i++) p.pb(p1[(i + pos1) % (int)p1.size()]); reverse(all(p)); for(int i = 0;i < (int)p2.size();i++) p.pb(p2[(i + pos2) % (int)p2.size()]); return p; } 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...