#ifndef _Pbrngw_
#include "longesttrip.h"
#endif // _Pbrngw_
#include<bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
#define task "kbsiudthw"
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef pair<int, ii> pii;
const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 2277;
bool are_connected(vi A, vi B);
vector<int> longest_trip(int n, int D){
if (D == 3){
vi ans;
FOR (i, 0, n - 1) ans.pb(i);
return ans;
}
if (D == 2){
deque<int> ans;
ans.pb(0);
vector<bool> marked(n, 0);
marked[0] = 1;
FOR (i, 1, n - 1){
if (are_connected({0}, {i})){
marked[i] = 1;
ans.pb(i);
break;
}
}
FOR (i, 0, n - 1){
if (marked[i]) continue;
if (are_connected({ans.front()}, {i})){
ans.push_front(i);
} else ans.pb(i);
}
vi res;
FOR (i, 0, n - 1) res.pb(ans[i]);
assert(res.size() == n);
return res;
}
vi A, B;
A.pb(0);
B.pb(1);
FOR (i, 2, n - 1){
if (are_connected({A.back()}, {i})){
A.pb(i);
continue;
}
if (are_connected({B.back()}, {i})){
B.pb(i);
continue;
}
reverse(ALL(B));
for (int &x : B) A.pb(x);
B.clear();
B.pb(i);
}
if (!are_connected(A, B)){
if (A.size() > B.size()) return A;
return B;
}
if (are_connected({A.back()}, {B.back()})){
reverse(ALL(B));
for (int &x : B) A.pb(x);
return A;
}
if (are_connected({A.back()}, {B.front()})){
for (int &x : B) A.pb(x);
return A;
}
if (are_connected({A.front()}, {B.back()})){
for (int &x : A) B.pb(x);
return B;
}
if (are_connected({A.front()}, {B.front()})){
reverse(ALL(B));
for (int &x : A) B.pb(x);
return B;
}
int l = 0, r = (int)B.size() - 1, ans = -1;
while (l <= r){
int m = (l + r) / 2;
vi vec;
FOR (i, 0, m) vec.pb(B[i]);
if (are_connected(A, vec)){
ans = B[m];
r = m - 1;
} else l = m + 1;
}
assert(ans != -1);
while (B.front() != ans){
B.pb(B.front());
B.erase(B.begin());
}
l = 0;
r = (int)A.size() - 1;
ans = -1;
while (l <= r){
int m = (l + r)/2;
vi vec;
FOR (i, 0, m) vec.pb(A[i]);
if (are_connected(vec, {B.front()})){
ans = A[m];
r = m - 1;
} else l = m + 1;
}
assert(ans != -1);
while (A.front() != ans){
A.pb(A.front());
A.erase(A.begin());
}
reverse(ALL(B));
for (int &x : A) B.pb(x);
return B;
}
#ifdef _Pbrngw_
bool are_connected(vi A, vi B){
cout << A[0] << ' ' << B[0] << endl;
int x; cin >> x;
return x;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")){
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
vi ans = longest_trip(5, 1);
for (int &x : ans) cout << x << ' ';
return 0;
}
#endif // _Pbrngw_
# | 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... |