제출 #957454

#제출 시각아이디문제언어결과실행 시간메모리
957454Turkhuu가장 긴 여행 (IOI23_longesttrip)C++17
15 / 100
10 ms600 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; vector<int> longest_trip(int N, int D) { if (D > 1) { deque<int> a; if (are_connected({0}, {1})) { a = {0, 1}; if (are_connected({0}, {2})) { a.push_front(2); } else { a.push_back(2); } } else { a = {0, 2, 1}; } for (int i = 3; i < N; i++) { if (are_connected({a.front()}, {i})) { a.push_front(i); } else { a.push_back(i); } } return vector(a.begin(), a.end()); } vector<int> a{0}, b{1}; for (int i = 2; i < N; i++) { if (are_connected({i}, {a.back()})) { a.push_back(i); } else if (are_connected({i}, {b.back()})) { b.push_back(i); } else { a.insert(a.end(), b.rbegin(), b.rend()); b = {i}; } } if (!are_connected(a, b)) { return a.size() > b.size() ? a : b; } int i, lo, hi; lo = 0, hi = a.size() - 1; while (lo < hi) { int mi = (lo + hi) / 2; are_connected(vector(a.begin(), a.begin() + mi + 1), b) ? hi = mi : lo = mi + 1; } i = lo, lo = 0, hi = b.size() - 1; while (lo < hi) { int mi = (lo + hi) / 2; are_connected(vector(b.begin(), b.begin() + mi + 1), {a[i]}) ? hi = mi : lo = mi + 1; } assert(a.size() == 1 || are_connected({a.front()}, {a.back()})); assert(b.size() == 1 || are_connected({b.front()}, {b.back()})); // assert(are_connected({a[i]}, {b[lo]})); vector<int> ans; ans.insert(ans.end(), a.begin() + i + 1, a.end()); ans.insert(ans.end(), a.begin(), a.begin() + i + 1); ans.insert(ans.end(), b.begin() + lo, b.end()); ans.insert(ans.end(), b.begin(), b.begin() + lo); return ans; }
#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...