题意
有n个人进行n-1场淘汰赛。现在给出每个人被哪一个人淘汰掉,要求安排一种比赛顺序使得最大的某个人赢得冠军需要比赛的场数尽量小。
n<=100000
分析
如果我们把打败关系看成一棵树的话,显然每次我们要选择一个叶节点和它的父亲比赛然后把它删掉。
设f[x]表示以x为根的子树最少比赛多少场后只剩下x。
假设我们删掉一个叶节点lea,其父亲为fa,那么有f[fa]=max(f[fa],f[lea])+1。
为了使f[1]尽量小,显然我们应该每次找f最小的叶子删掉。
用一个堆来维护叶子即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
using namespace