传送门啦 分析: 这个题看起来像是个树形dp,嗯,就是看起来像. 所以我们就按树形dp的思路去分析就好了,这个题是一个树形dp的变形题. 和以前建树是一样的,我们用邻接表来进行储存.利用邻接表的特性,我们可以先加左边的点,再加右边的点,这样遍历的时候就可以先左后右了. 分析题意后我们设立几个数组: (邻接表的就不说了,大家应该都会吧) f [ i ] :表示使 i 这棵子树满足条件,所需要的最小的步数. dep[ i ]:表示 i 这一个点的深度 maxdep[ i ]:表示 i 这个点的子树中…
没有算法,但是要注意细节. 首先无解的情况,显然的是最小深度的叶子节点和最大深度的叶子节点的深度差大于1:还有一种比较难想,就是如果一个点的左右子树都有最大和最小深度的叶子节点,这样交换左右子树也不行. 答案比较容易,就是统计一下右子树size>左子树size的节点个数即可. #include<iostream> #include<cstdio> using namespace std; const int N=200005; int n,h[N],cnt,tot,c[N][…