#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;
deque<int> L = {0};
set<int> not_in_l;
ll l = 0, r = n;
while(l+1 < r){
ll mid = l+r>>1;
vector<int> tmp;
for(int i = 1 ; i <= mid ; i++)tmp.push_back(i);
if(ask({0},tmp))r = mid;
else l = mid;
}
if(r==n){ for(int i = 1 ; i < n ; i++)ret.push_back(i); return ret; }
L.push_back(r);
vector<int> v;
for(int i = 1 ; i < n ; i++)if(i!=r)not_in_l.insert(i), v.push_back(i);
for(auto i : v){
if(!ask({L[0],L.back()}, {i}))continue;
not_in_l.erase(i);
if(ask({L[0]}, {i}))L.push_front(i);
else L.push_back(i);
}
if(!sz(not_in_l)){for(auto i : L)ret.push_back(i); return ret;}
v.clear(); for(auto i : not_in_l)v.push_back(i);
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)){for(auto i : L)ret.push_back(i); return ret;}
return v; //v는 clique
}
else{
ll idx = r;
l = -1, r = sz(v);
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[idx]},tmp))r = mid;
else l = mid;
}
ll idx2 = r;
if(idx==0){ //둘이 합침
for(int i = (idx2+1)%sz(v), j = 0 ; j < sz(v) ; j++, i = (i+1)%sz(v)){
ret.push_back(v[i]);
}
for(auto i : L)ret.push_back(i);
return ret;
}
//여기서 L[0]와 L.back()은 연결이 보장됨
for(int i = idx+1, j = 0 ; j < sz(L) ; j++, i = (i+1)%sz(L)){
ret.push_back(L[i]);
}
for(int i = idx2, j = 0 ; j < sz(v) ; j++, i = (i+1)%sz(v)){
ret.push_back(v[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... |