제출 #1016502

#제출 시각아이디문제언어결과실행 시간메모리
1016502pavement가장 긴 여행 (IOI23_longesttrip)C++17
15 / 100
15 ms600 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; #define pb push_back mt19937 rng(42); int qu; vector<int> perm; bool my_are_connected(vector<int> v1, vector<int> v2) { qu++; for (auto &i : v1) { i = perm[i]; } for (auto &i : v2) { i = perm[i]; } return are_connected(v1, v2); } vector<int> longest_trip(int N, int D) { vector<int> ret; qu = 0; perm.resize(N); iota(perm.begin(), perm.end(), 0); shuffle(perm.begin(), perm.end(), rng); if (D == 3) { ret.resize(N); iota(ret.begin(), ret.end(), 0); } else if (D == 2) { deque<int> dq; int st = -1; dq.pb(0); if (my_are_connected({0}, {1})) { dq.pb(1); st = 2; } else { dq.pb(2); dq.pb(1); st = 3; } for (int i = st; i < N; i++) { if (my_are_connected({i}, {dq.back()})) { dq.pb(i); } else { dq.push_front(i); } } ret = vector<int>(dq.begin(), dq.end()); } else { deque<int> ch1, ch2; ch1.pb(0); for (int i = 1; i < N; i++) { if (my_are_connected({ch1.back()}, {i})) { ch1.pb(i); if (!ch2.empty() && my_are_connected({ch2.back()}, {i})) { while (!ch2.empty()) { ch1.pb(ch2.back()); ch2.pop_back(); } } } else { ch2.pb(i); } } assert(qu <= 382); vector<int> vec1(ch1.begin(), ch1.end()), vec2(ch2.begin(), ch2.end()); if (vec2.empty()) { ret = vec1; } else { if (my_are_connected({vec1[0]}, {vec2.back()})) { for (int i = (int)vec1.size() - 1; i >= 0; i--) { ret.pb(vec1[i]); } for (int i = (int)vec2.size() - 1; i >= 0; i--) { ret.pb(vec2[i]); } } else if (my_are_connected({vec1.back()}, {vec2[0]})) { for (int i = 0; i < (int)vec1.size(); i++) { ret.pb(vec1[i]); } for (int i = 0; i < (int)vec2.size(); i++) { ret.pb(vec2[i]); } } else { //~ assert(qu <= 384); int lo = 0, hi = (int)vec1.size() - 1, idx1 = -1; while (lo <= hi) { int mid = (lo + hi) / 2; if (my_are_connected(vector<int>(vec1.begin(), vec1.begin() + mid + 1), vec2)) { idx1 = mid; hi = mid - 1; } else { lo = mid + 1; } } if (idx1 == -1) { if (vec1.size() > vec2.size()) { ret = vec1; } else { ret = vec2; } } else { assert(idx1 != -1); lo = 0, hi = (int)vec2.size() - 1; int idx2 = -1; while (lo <= hi) { int mid = (lo + hi) / 2; if (my_are_connected(vector<int>(vec2.begin(), vec2.begin() + mid + 1), {vec1[idx1]})) { idx2 = mid; hi = mid - 1; } else { lo = mid + 1; } } assert(idx2 != -1); // vec1[idx1] and vec2[idx2] are connected for (int i = (idx1 + 1) % (int)vec1.size(); i != idx1; i = (i + 1) % (int)vec1.size()) { ret.pb(vec1[i]); } ret.pb(vec1[idx1]); for (int i = idx2; (int)ret.size() != N; i = (i + 1) % (int)vec2.size()) { ret.pb(vec2[i]); } } } } } for (auto &i : ret) { i = perm[i]; } return ret; }
#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...