首先用树状数组维护dfs序来快速支持一个点子树大小的询问. 每次删掉一个叶子时,从根开始往叶子走,显然只有$2size[x]\leq size[father]$的点的父亲才有可能换重儿子. 从根开始往下,找到最高的满足条件的点,从那个点开始继续迭代,每次点数至少减小一半,所以迭代只有$O(\log n)$次. 时间复杂度$O(n\log^2n)$. #include<cstdio> const int N=200010; int n,m,x,i,ch[N][2],size[N],f[N],d[…