Submission #1017164

#TimeUsernameProblemLanguageResultExecution timeMemory
1017164pavementLongest Trip (IOI23_longesttrip)C++17
100 / 100
14 ms600 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; #define pb push_back mt19937 rng(42); vector<int> perm; bool my_are_connected(vector<int> v1, vector<int> v2) { 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; 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); bool back_joined = 1; for (int i = 1; i < N; i++) { if (ch2.empty()) { ch2.pb(i); continue; } bool conn_to_1 = my_are_connected({ch1.back()}, {i}); if (conn_to_1) { ch1.pb(i); back_joined = 1; } else { bool conn_to_2 = (!back_joined || my_are_connected({ch2.back()}, {i})); if (conn_to_2) { ch2.pb(i); back_joined = 0; } else { while (!ch2.empty()) { ch1.pb(ch2.back()); ch2.pop_back(); } ch2.pb(i); back_joined = 1; } } } vector<int> vec1(ch1.begin(), ch1.end()), vec2(ch2.begin(), ch2.end()); if (vec2.empty()) { ret = vec1; } else { if (my_are_connected({vec1.back()}, {vec2.back()})) { for (int i = 0; i < (int)vec1.size(); 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[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 { 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...