#include "longesttrip.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> longest_trip(int N, int D) {
auto connected = [&] (int u, int v) { return are_connected({u}, {v}); };
vector <int> path;
if (D == 3) {
path.resize(N);
iota(path.begin(), path.end(), 0);
} else if (D == 2) {
if (!connected(0, 1)) path = {0, 2, 1};
else if (!connected(0, 2)) path = {0, 1, 2};
else path = {1, 0, 2};
for (int i = 3; i < N; ++i) {
if (!connected(i, path.back())) path.insert(path.begin(), i);
else path.push_back(i);
}
} else {
vector <int> left{0}, right{1};
bool last = false;
for (int i = 2; i < N; ++i) {
if (connected(left.back(), i)) {
left.push_back(i);
last = false;
} else if (last || connected(right.back(), i)) {
right.push_back(i);
last = true;
} else {
left.insert(left.end(), right.rbegin(), right.rend());
right = {i};
last = false;
}
}
if (left.size() < right.size()) swap(left, right);
if (right.empty() || !are_connected(left, right)) return left;
for (int t = 0; t < 2; ++t) {
if ((int) left.size() > 1) {
if (connected(left.back(), right.back())) {
left.insert(left.end(), right.rbegin(), right.rend());
return left;
} else if (connected(left[0], right.back())) {
right.insert(right.end(), left.begin(), left.end());
return right;
}
}
swap(left, right);
}
int l = 1, r = (int) left.size() - 1;
while (l <= r) {
int m = l + r >> 1;
if (are_connected(vector(left.begin(), left.begin() + m), right)) r = m - 1;
else l = m + 1;
}
rotate(left.begin(), left.begin() + l, left.end());
l = 0, r = (int) right.size() - 2;
while (l <= r) {
int m = l + r >> 1;
if (are_connected(vector(right.begin(), right.begin() + m + 1), {left.back()})) r = m - 1;
else l = m + 1;
}
rotate(right.begin(), right.begin() + l, right.end());
left.insert(left.end(), right.begin(), right.end());
return left;
}
return path;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |