#include "longesttrip.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
#define sz(x) x.size()
#define all(x) x.begin(), x.end()
bool ask(vector<int> u, vector<int> v){
    return are_connected(u,v);
}
std::vector<int> longest_trip(int n, int D)
{
    //D=1
    vector<int> ret;
    vector<int> L = {0};
    set<int> not_in_l;
    for(int i = 1 ; i < n ; i++)not_in_l.insert(i);
    while(sz(not_in_l)){
        vector<int> v;
        for(auto i : not_in_l)v.push_back(i);
        ll l = -1, r = sz(v);   //처음으로 connected 되는 위치가 r에 저장됨
        while(l+1 < r){
            ll mid = l+r>>1;
            vector<int> tmp;
            for(int i = 0 ; i <= mid ; i++)tmp.push_back(v[i]);
            if(ask({L.back()}, tmp))r = mid;
            else l = mid;
        }
        if(r == sz(v))break;
        L.push_back(v[r]); not_in_l.erase(v[r]);
    }
    if(!sz(not_in_l))return L;
    vector<int> v;
    for(auto i : not_in_l)v.push_back(i);
    ll l = -1, r = sz(L);
    while(l+1 < r){
        ll mid = l+r>>1;
        vector<int> tmp;
        for(int i = 0 ; i <= mid ; i++)tmp.push_back(L[i]);
        if(ask(v,tmp))r = mid;
        else l = mid;
    }
    if(r == sz(L)){    //컴포넌트 분리됨
        if(sz(v) < sz(L))return L;
        return v;   //v는 clique
    }
    else{
        if(r==0){   //둘이 합침
            for(auto i : L)v.push_back(i);
            return v;
        }
        //여기서 L[0]와 L.back()은 연결이 보장됨
        for(int i = r+1, j = 0 ; j < sz(L) ; j++, i = (i+1)%sz(L)){
            ret.push_back(L[i]);
        }
        for(auto i : v)ret.push_back(i);
        return ret;
    }
}
| # | 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... |