Submission #851700

#TimeUsernameProblemLanguageResultExecution timeMemory
851700denniskimLongest Trip (IOI23_longesttrip)C++17
100 / 100
12 ms856 KiB
#include "longesttrip.h"
#include <bits/stdc++.h>

using namespace std;
typedef int ll;
typedef __int128 lll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
#define MAX 9223372036854775807LL
#define MIN -9223372036854775807LL
#define INF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10);
#define sp << " "
#define en << "\n"
#define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end())

ll n;
ll chk[310];

ll query(ll X, ll Y)
{
	vector<ll> tmp1, tmp2;
	
	tmp1.push_back(X);
	tmp2.push_back(Y);
	
	return are_connected(tmp1, tmp2);
}

vector<ll> longest_trip(ll N, ll D)
{
	vector<ll> ans;
	set<ll> st;
	n = N;
	
	for(ll i = 0 ; i < n ; i++)
	{
		chk[i] = 0;
		st.insert(i);
	}
	
	if(D == 3)
	{
		for(ll i = 0 ; i < n ; i++)
			ans.push_back(i);
		
		return ans;
	}
	
	if(D == 2)
	{
		ans.push_back(0);
		chk[0] = 1;
		st.erase(0);
		
		while(1)
		{
			ll ff = 0;
			
			for(auto &i : st)
			{
				if(query(ans.back(), i))
				{
					ans.push_back(i);
					chk[i] = 1;
					st.erase(i);
					ff = 1;
					break;
				}
			}
			
			if(!ff)
				break;
		}
		
		reverse(ans.begin(), ans.end());
		
		for(auto &i : st)
			ans.push_back(i);
		
		return ans;
	}
	
	vector<ll> P1, P2;
	ll ST = 0;
	
	if(n % 2 == 0)
	{
		if(query(0, 1))
		{
			P1.push_back(0);
			P1.push_back(1);
		}
		
		else
		{
			P1.push_back(0);
			P2.push_back(1);
		}
		
		ST = 2;
	}
	
	else
	{
		P1.push_back(0);
		ST = 1;
	}
	
	for(ll i = ST ; i < n ; i += 2)
	{
		if(P2.empty())
		{
			ll Q1 = query(i, i + 1);
			ll Q2 = query(P1.back(), i);
			ll Q3 = query(P1.back(), i + 1);
			
			if(Q1)
			{
				if(Q2)
				{
					P1.push_back(i);
					P1.push_back(i + 1);
				}
				
				else if(Q3)
				{
					P1.push_back(i + 1);
					P1.push_back(i);
				}
				
				else
				{
					P2.push_back(i);
					P2.push_back(i + 1);
				}
			}
			
			else
			{
				if(Q2)
				{
					P1.push_back(i);
					P2.push_back(i + 1);
				}
				
				else
				{
					P1.push_back(i + 1);
					P2.push_back(i);
				}
			}
		}
		
		else
		{
			ll Q1 = query(i, i + 1);
			
			if(Q1)
			{
				ll Q2 = query(P1.back(), i);
				
				if(!Q2)
					swap(P1, P2);
				
				P1.push_back(i);
				
				if(query(P2.back(), i + 1))
				{
					P2.push_back(i + 1);
					reverse(P2.begin(), P2.end());
					
					for(auto &j : P2)
						P1.push_back(j);
					
					P2.clear();
				}
				
				else
					P1.push_back(i + 1);
			}
			
			else
			{
				ll Q2 = query(P1.back(), i);
				
				if(!Q2)
					swap(P1, P2);
				
				if(query(P2.back(), i + 1))
				{
					P1.push_back(i);
					P2.push_back(i + 1);
				}
				
				else
				{
					P1.push_back(i + 1);
					P2.push_back(i);
				}
			}
		}
		
		if((ll)P1.size() < (ll)P2.size())
			swap(P1, P2);
	}
	
	if(P2.empty())
		return P1;
	
	if(!are_connected(P1, P2))
		return P1;
	
	vector<ll> tmp1;
	
	tmp1.push_back(P2[0]);
	
	if((ll)P2.size() > 1)
		tmp1.push_back(P2.back());
	
	if(are_connected({P1.back()}, tmp1))
	{
		if(are_connected({P1.back()}, {P2[0]}))
		{
			for(auto &i : P2)
				P1.push_back(i);
			
			return P1;
		}
		
		reverse(P2.begin(), P2.end());
		
		for(auto &i : P2)
			P1.push_back(i);
		
		return P1;
	}
	
	else if(are_connected({P1[0]}, tmp1))
	{
		reverse(P1.begin(), P1.end());
		
		if(are_connected({P1.back()}, {P2[0]}))
		{
			for(auto &i : P2)
				P1.push_back(i);
			
			return P1;
		}
		
		reverse(P2.begin(), P2.end());
		
		for(auto &i : P2)
			P1.push_back(i);
		
		return P1;
	}
	
	ll l = 0, r = (ll)P1.size() - 1;
	
	while(l <= r)
	{
		ll mid = (l + r) >> 1;
		vector<ll> Pcut;
		
		for(ll i = 0 ; i <= mid ; i++)
			Pcut.push_back(P1[i]);
		
		if(are_connected(Pcut, P2))
			r = mid - 1;
		else
			l = mid + 1;
	}
	
	ll idx1 = l;
	
	l = 0, r = (ll)P2.size() - 1;
	
	while(l <= r)
	{
		ll mid = (l + r) >> 1;
		vector<ll> Pcut;
		
		for(ll i = 0 ; i <= mid ; i++)
			Pcut.push_back(P2[i]);
		
		if(are_connected({P1[idx1]}, Pcut))
			r = mid - 1;
		else
			l = mid + 1;
	}
	
	ll idx2 = l;
	
	for(ll i = idx1 - 1 ; i >= 0 ; i--)
		ans.push_back(P1[i]);
	
	for(ll i = (ll)P1.size() - 1 ; i >= idx1 ; i--)
		ans.push_back(P1[i]);
	
	for(ll i = idx2 ; i < (ll)P2.size() ; i++)
		ans.push_back(P2[i]);
	
	for(ll i = 0 ; i < idx2 ; i++)
		ans.push_back(P2[i]);
	
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...