제출 #566390

#제출 시각아이디문제언어결과실행 시간메모리
566390zaneyu즐거운 행로 (APIO20_fun)C++14
26 / 100
69 ms34972 KiB
#include "fun.h"

#include <bits/stdc++.h>
#define pb push_back
#define sz(x) (int)x.size()
#define REP1(i,n) for(int i=1;i<=n;i++)
using namespace std;
const int maxn=1e3+5;
#define REP(i,n) for(int i=0;i<n;i++)
int dist[maxn][maxn];
bool vis[maxn];
vector<int> v[maxn];
int dep[maxn];
deque<int> vv[maxn];
void dfs(int u){
	vv[dep[u]].pb(u);
	for(int x:v[u]){
		dep[x]=dep[u]+1;
		dfs(x);
	}
}
int get(int a,int b){
	int d=0;
	while(a!=b){
		if(dep[a]>dep[b]){
			a=(a-1)/2;
		}
		else b=(b-1)/2;
		++d;
	}
	return d;
}
vector<int> createFunTour(int n, int q) {
	if(n>500){
		REP1(i,n-1){
			v[(i-1)/2].pb(i);
		}
		dfs(0);
		int st=n-1;
		vector<int> ans;
		REP(i,n){
			ans.pb(st);
			int mx=0,p=0;
			for(int j=19;j>=0;j--){
				if(sz(vv[j])){
					int a=vv[j][0];
					if(get(st,a)>mx){
						mx=get(st,a);
						p=a;
					}
					a=vv[j].back();
					if(get(st,a)>mx){
						mx=get(st,a);
						p=a;
					}
				}
			}
			st=p;
		}
	}
	int st=0,mx=0;
	REP(i,n){
		REP(j,i){
			dist[i][j]=hoursRequired(i,j);
			if(dist[i][j]>mx){
				mx=dist[i][j];
				st=i;
			}
		}
	}
	REP(i,n){
		REP(j,n){
			if(!dist[i][j]) dist[i][j]=dist[j][i];
		}
	}
	vector<int> ans;
	REP(asd,n){
		ans.push_back(st);
		vis[st]=1;
		int mx=0,p=0;
		REP(j,n){
			if(!vis[j]){
				if(dist[st][j]>mx){
					mx=dist[st][j];
					p=j;
				}
			}
		}
		st=p;
	}
	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...