#include "longesttrip.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define pb push_back
vector<int> longest_trip(int n, int D) {
if (D == 3) {
vector<int> v(n);
iota(v.begin(), v.end(), 0);
return v;
}
if (D == 2) {
deque<int> dq;
dq = {0};
set<int> s;
for (int i = 1; i < n; ++i) s.insert(i);
while (s.size() > 1) {
int x = *s.begin(); s.erase(x);
int y = *s.begin(); s.erase(y);
if (are_connected({dq.back()}, {x})) {
dq.pb(x);
s.insert(y);
}
else {
dq.pb(y);
s.insert(x);
}
}
int x = *s.begin();
if (are_connected({dq.back()}, {x}))
dq.pb(x);
else
dq.push_front(x);
vector<int> v(n);
for (int i = 0; i < n; ++i) v[i] = dq[i];
return v;
}
if (D == 1) {
vector<int> A = {0}, B;
for (int i = 1; i < n; ++i) {
bool a = are_connected({A.back()}, {i});
if (B.empty()) {
if (a)
A.pb(i);
else
B.pb(i);
}
else {
bool b = are_connected({B.back()}, {i});
if (a && b) {
A.pb(i);
reverse(B.begin(), B.end());
for (auto x : B) A.pb(x);
B.clear();
}
else if (a)
A.pb(i);
else
B.pb(i);
}
}
if (B.empty()) return A;
if (are_connected(A, B)) {
auto a = A, b = B;
while (a.size() > 1 || b.size() >= 1) {
if (a.size() > 1) {
vector<int> c[2];
for (int i = 0; i < a.size(); ++i) c[i%2].pb(a[i]);
if (are_connected({c[0]}, {b}))
a = c[0];
else
a = c[1];
}
if (b.size() > 1) {
vector<int> c[2];
for (int i = 0; i < b.size(); ++i) c[i%2].pb(b[i]);
if (are_connected({c[0]}, {a}))
b = c[0];
else
b = c[1];
}
}
int x = a[0], y = b[0];
if (are_connected({A.back()}, {B.back()})) {
while (A.back() != x) {
B.pb(A.back());
A.pop_back();
}
}
else if (are_connected({A[0]}, {B.back()})) {
reverse(A.begin(), A.end());
while (A.back() != x) {
B.pb(A.back());
A.pop_back();
}
}
else {
vector<int> c;
while (A.back() != x) {
c.pb(A.back());
A.pop_back();
}
reverse(A.begin(), A.end());
while (!A.empty()) {
c.pb(A.back());
A.pop_back();
}
}
if (are_connected({A[0]}, {B.back()})) {
reverse(A.begin(), A.end());
for (auto i : A) B.pb(i);
return B;
}
else if (are_connected({A[0]}, {B[0]})) {
reverse(B.begin(), B.end());
for (auto i : A) B.pb(i);
return B;
}
vector<int> c;
while (B.back() != y) {
c.pb(B.back());
B.pop_back();
}
reverse(B.begin(), B.end());
for (auto i : c) B.pb(i);
for (auto x : B) A.pb(x);
return A;
}
return A.size() > B.size() ? A : B;
}
return {};
}
# | 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... |