#include "longesttrip.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define all(x) x.begin(),x.end()
std::vector<int> longest_trip(int n, int D)
{
    deque<int> a,b;
    vector<int> ord(n);
    for(int i=0;i<n;i++){
        ord[i]=i;
    }
    mt19937 rng(time(NULL));
    shuffle(all(ord),rng);
    a.push_back(ord[0]);
    b.push_back(ord[1]);
    bool con=false;
    for(int t=2;t<n;t++){
        int i=ord[t];
        int x=a.back();
        int y=b.back();
        if(are_connected({x},{i})){
            a.push_back(i);
            con=false;
        }
        else if(con or are_connected({y},{i})){
            b.push_back(i);
            con=true;
        }
        else{
            while(!b.empty()){
                a.push_back(b.back());
                b.pop_back();
            }
            b.push_back(i);
            con=false;
        }
    }
    if((int)a.size()<(int)b.size()) swap(a,b);
    if(b.empty()){
        vector<int> tmp(a.size());
        for(int i=0;i<(int)a.size();i++) tmp[i]=a[i];
        return tmp;
    }
    if(are_connected({b[0]},{a[0]})){
        while(!b.empty()){
            a.push_front(b[0]);
            b.pop_front();
        }
    }
    else if(are_connected({b[0]},{a.back()})){
        while(!b.empty()){
            a.push_back(b[0]);
            b.pop_front();
        }
    }
    else if(are_connected({b.back()},{a[0]})){
        while(!b.empty()){
            a.push_front(b.back());
            b.pop_back();
        }
    }
    else if(are_connected({b.back()},{a.back()})){
        while(!b.empty()){
            a.push_back(b.back());
            b.pop_back();
        }
    }
    else{
        {
            vector<int> A(a.size()),B(b.size());
            for(int i=0;i<(int)a.size();i++) A[i]=a[i];
            for(int i=0;i<(int)b.size();i++) B[i]=b[i];
            if(!are_connected(A,B)) return A;
        }
        int l=0,r=(int)b.size()-1;
        int tl=0,tr=(int)a.size()-1;
        while(l<r or tl<tr){
            if(l<r){
                int mid=(l+r)/2;
                vector<int> B;
                for(int i=0;i<=mid;i++){
                    B.push_back(b[i]);
                }
                vector<int> tmp;
                for(int i=0;i<=tr;i++) tmp.push_back(a[i]);
                if(are_connected(B,tmp)){
                    r=mid;
                }
                else{
                    l=mid+1;
                }
            }
            if(tl<tr){
                int mid=(tl+tr)/2;
                vector<int> A;
                for(int i=0;i<=mid;i++){
                    A.push_back(a[i]);
                }
                vector<int> tmp;
                for(int i=0;i<=r;i++) tmp.push_back(b[i]);
                if(are_connected(A,tmp)){
                    tr=mid;
                }
                else{
                    tl=mid+1;
                }
            }
        }
        int pos=l,pos2=tl;
        deque<int> tmp;
        for(int i=pos2+1;i<(int)a.size();i++) tmp.push_back(a[i]);
        for(int i=0;i<=pos2;i++) tmp.push_back(a[i]);
        for(int i=pos;i>=0;i--) tmp.push_back(b[i]);
        for(int i=(int)b.size()-1;i>pos;i--) tmp.push_back(b[i]);
        swap(tmp,a);
    }
    {
        vector<int> tmp(a.size());
        for(int i=0;i<(int)a.size();i++) tmp[i]=a[i];
        return tmp;
    }
}
| # | 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... |