제출 #1360984

#제출 시각아이디문제언어결과실행 시간메모리
1360984Jawad_Akbar_JJFun Tour (APIO20_fun)C++20
47 / 100
354 ms100340 KiB
#include <iostream>
#include <vector>
#include <set>
#include "fun.h"

using namespace std;
const int M = 1<<17;
vector<int> nei[M];
set<pair<int, int>> st[M];
int Par[M], hei[M], Er[M];

void dfs(int u, int p, int h = 1){
	Par[u] = p;
	hei[u] = h;

	for (int i=0;i<nei[u].size();i++){
		if (nei[u][i] == p)
			nei[u].erase(begin(nei[u]) + i);
	}

	for (int i : nei[u]){
		// cout<<u<<" --> "<<i<<endl;
		dfs(i, u, h + 1);
		for (auto [x, y] : st[i])
			st[u].insert({x, y});
	}
	st[u].insert({h, u});
}


int getFar(int u){
	int dst = 0, v = u, ansV;

	// cout<<v<<" :: "<<endl;;

	if (st[u].size() > 1)
		dst = (*rbegin(st[u])).first - hei[v], ansV = (*rbegin(st[u])).second;
	while (Par[u] != -1){
		u = Par[u];
		for (int i : nei[u]){
			if (st[i].find({hei[v], v}) == st[i].end() and st[i].size() > 0){
				// cout<<u<<','<<i<<' ';
				// for (auto [x, y] : st[i])
				// 	cout<<"{"<<x<<','<<y<<"} ";
				// cout<<endl;
				auto [x, y] = *rbegin(st[i]);
				if (x + hei[v] - 2 * hei[u] > dst)
					dst = x + hei[v] - 2 * hei[u], ansV = y;
			}
		}
		if (Er[u] == 0 and hei[v] - hei[u] > dst)
			dst = hei[v] - hei[u], ansV = u;
	}
	return ansV;
}

void Erase(int u){
	int v = u;
	while (u != -1){
		st[u].erase({hei[v], v});
		u = Par[u];
	}
	Er[v] = 1;
}

vector<int> createFunTour(int n, int q){
	if (n <= 500){
		for (int i=0;i<n;i++){
			for (int j=0;j<n;j++)
				if (i != j and hoursRequired(i, j) == 1)
					nei[i].push_back(j);
		}
	}
	else{
		for (int i=1;i<n;i++){
			int p = (i - 1) / 2;
			nei[p].push_back(i);
			nei[i].push_back(p);
		}
	}

	dfs(0, -1);

	vector<int> ans = {0};
	for (int i=1;i<n;i++){
		if (hei[i] > hei[ans.back()])
			ans = {i};
	}

	for (int i=1;i<n;i++){
		int v = getFar(ans.back());

		// cout<<ans.back()<<' '<<v<<endl;
		Erase(ans.back());
		ans.push_back(v);
	}
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…