Submission #1233263

#TimeUsernameProblemLanguageResultExecution timeMemory
1233263MuhammadSaramLongest Trip (IOI23_longesttrip)C++17
40 / 100
342 ms524 KiB
#include "longesttrip.h"
#include <bits/stdc++.h>

using namespace std;

// #define get are_connected

const int M = 256;
bool edg[M][M];

bool get(vector<int> v,vector<int> v1)
{
	for (int i:v)
		for (int j:v1)
			if (edg[i][j]) return 1;
	return 0;
}

int find(vector<int> v,vector<int> v1)
{
	int s=-1,e=v1.size()-1;
	while (s+1<e)
	{
		int mid=(s+e)/2;
		vector<int> c;
		for (int i=0;i<=mid;i++) c.push_back(v1[i]);
		if (get(v,c))
			e=mid;
		else
			s=mid;
	}
	return e;
}

vector<int> merge(vector<int> &v1,vector<int> &v)
{
	int x=find(v,v1);
	int y=find({v1[x]},v);
	vector<int> ans;
	for (int i:v)
		if (i!=v[y])
			ans.push_back(i);
	ans.push_back(v[y]);
	for (int i=x;i<v1.size();i++)
		ans.push_back(v1[i]);
	return ans;
}

vector<int> longest_trip(int n, int D)
{
	for (int i=0;i<n;i++)
		for (int j=i+1;j<n;j++)
			edg[i][j]=edg[j][i]=are_connected({i},{j});
	bool vis[n]={};
	vector<int> cur={0};vis[0]=1;
	while (cur.size()<n)
	{
		vector<int> v;
		for (int i=0;i<n;i++)
			if (!vis[i]) v.push_back(i);
		if (!get({cur.back()},v)) break;
		int s=-1,e=v.size()-1;
		while (s+1<e)
		{
			int mid=(s+e)/2;
			vector<int> v1;
			for (int i=0;i<=mid;i++)
				v1.push_back(v[i]);
			if (get({cur.back()},v1))
				e=mid;
			else
				s=mid;
		}
		cur.push_back(v[e]),vis[v[e]]=1;
	}
	vector<vector<int>> pot;
	pot.push_back(cur);
	vector<int> v;
	for (int i=0;i<n;i++)
		if (!vis[i]) v.push_back(i);
	pot.push_back(v);
	if (v.size() && get(cur,v))
	{
		pot.push_back(merge(cur,v));
		reverse(cur.begin(),cur.end());
		pot.push_back(merge(cur,v));
	}
	vector<int> ans;
	for (auto v:pot)
		if (v.size()>ans.size()) ans=v;
	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...