Submission #1016452

#TimeUsernameProblemLanguageResultExecution timeMemory
1016452pavementLongest Trip (IOI23_longesttrip)C++17
15 / 100
195 ms600 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; #define pb push_back vector<int> longest_trip(int N, int D) { vector<int> ret; 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 (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 (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); int i = 1; for (; i < N; i++) { vector<int> tmp; if (ch1.size() == 1) { tmp.pb(ch1.front()); } else { tmp.pb(ch1.front()); tmp.pb(ch1.back()); } if (are_connected(tmp, {i})) { if (are_connected({ch1.front()}, {i})) { ch1.push_front(i); } else { ch1.pb(i); } } else { ch2.pb(i); break; } } for (i++; i < N; i++) { if (are_connected({ch1.back()}, {i})) { ch1.pb(i); if (ch2.size() == 1) { if (are_connected({ch2.back()}, {i})) { ch1.pb(ch2.back()); ch2.pop_back(); } } else if (!ch2.empty()) { if (are_connected({ch2.front(), ch2.back()}, {i})) { if (are_connected({ch2.back()}, {i})) { while (!ch2.empty()) { ch1.pb(ch2.back()); ch2.pop_back(); } } else { while (!ch2.empty()) { ch1.pb(ch2.front()); ch2.pop_front(); } } } } } else { ch2.pb(i); if (are_connected({ch1.front()}, {i})) { while (!ch2.empty()) { ch1.push_front(ch2.back()); ch2.pop_back(); } } } } vector<int> vec1(ch1.begin(), ch1.end()), vec2(ch2.begin(), ch2.end()); if (!vec1.empty() && !vec2.empty() && are_connected(vec1, vec2)) { int lo = 0, hi = (int)vec1.size() - 1, idx1 = -1; while (lo <= hi) { int mid = (lo + hi) / 2; if (are_connected(vector<int>(vec1.begin() + lo, vec1.begin() + mid + 1), vec2)) { idx1 = i; hi = mid - 1; } else { lo = mid; } } assert(idx1 != -1); lo = 0, hi = (int)vec2.size() - 1; int idx2 = -1; while (lo <= hi) { int mid = (lo + hi) / 2; if (are_connected(vector<int>(vec2.begin() + lo, vec2.begin() + mid + 1), {idx1})) { idx2 = i; hi = mid - 1; } else { lo = mid; } } 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]); } for (int i = idx2; (int)ret.size() != N; i = (i + 1) % (int)vec2.size()) { ret.pb(vec2[i]); } } else { if (vec1.size() > vec2.size()) { ret = vec1; } else { ret = vec2; } } } 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...