#include<bits/stdc++.h>
#include "longesttrip.h"
using namespace std;
int n,d;
vector<int> l,r;
bool query(vector<int> a,vector<int> b){
return are_connected(a,b);
}
vector<int> longest_trip(int N, int D){
n=N; d=D;
l.clear(); r.clear();
l.push_back(0);
if(query({0},{1})){
l.push_back(1);
}else{
r.push_back(1);
}
for(int i=2;i<n;i++){
if(query({l.back()},{i})){
l.push_back(i);
if(!r.empty() and query({r.back()},{i})){
while(!r.empty()){
l.push_back(r.back());
r.pop_back();
}
}
}else{
r.push_back(i);
}
}
if(d==1){
if(r.empty())return l;
if(!query(l,r)){
if(l.size()>r.size())return l;
else return r;
}else{
if(query({l.front()},{r.back()})){
for(int i:l)r.push_back(i);
return r;
}
if(query({r.front()},{l.back()})){
for(int i:r)l.push_back(i);
return l;
}
if(query({l.front()},{r.front()})){
reverse(l.begin(),l.end());
for(int i:r)l.push_back(i);
return l;
}
int ll=-1,rr=int(l.size())-1,mid;
while(ll+1<rr){
mid=(ll+rr)/2;
vector<int> w;
for(int i=0;i<=mid;i++)w.push_back(l[i]);
if(query(w,r)){
rr=mid;
}else{
ll=mid;
}
}
int from=rr;
vector<int> cutl;
for(int i=0;i<=from;i++)cutl.push_back(l[i]);
ll=-1; rr=int(r.size())-1;
while(ll+1<rr){
mid=(ll+rr)/2;
vector<int> w;
for(int i=0;i<=mid;i++)w.push_back(r[i]);
if(query(cutl,w)){
rr=mid;
}else{
ll=mid;
}
}
int to=rr;
vector<int> path;
for(int i=from+1;i<l.size();i++)path.push_back(l[i]);
for(int i=0;i<=from;i++)path.push_back(l[i]);
for(int i=to;i<r.size();i++)path.push_back(r[i]);
for(int i=0;i<to;i++)path.push_back(r[i]);
return path;
}
}else{
for(int i:l)r.push_back(i);
return r;
}
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... |