传送门
思路:
我们需要抓住唯一的重要信息点”ci”,我的做法也是在猜想和尝试中得出的,之后再验证算法的正确性。
我们在构造中发现,如果树上出现了相同的数字,则会让树的构造变得不清晰。
我们尝试用不同的数值a[1]~a[n]去构造树,我们唯一知道的信息就是”ci”,如果a[1]~a[n] = 1~n(从小到大排序),则我们容易确定root的数值id[root] = a[c[root] + 1]。为什么?因为我们有1~n这n个数字,如果我们id[root] = a[c[root] + 1],则root下面的点,无论怎么放置这n-1个数字都满足c[root]。如果该root的左边第一个son节点的c[x] = t,则id[x]为第c[x] + 1个数字(因为id[root]被使用了)好像也行的通(红字带入也行得通),然后我按着从左开始的dfs序模拟,发现问题就解决了,这样的方法是行的通的。为什么?模拟了之后才发现,因为我们选的是不同的数字,我们如果按着从左的dfs序一个个的解决子树,只要有足够的不同数字,则该方法一定是可以构造出当前子树的信息(带入红字理解),即子树之间独立不影响。用这个构造方法之前只需要先判断下所有的ci是不是合法,即该点下面如果只有x个数字,c[now]>x就是不合法的。代码下面有个样例,模拟下就理解了。
#include
#include
#include
#include
#include
#include <string>
#include
Original: https://www.cnblogs.com/SSummerZzz/p/14070624.html
Author: SummerMingQAQ
Title: D. Numbers on Tree(构造)【CF 1287】
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584291/
转载文章受原作者版权保护。转载请注明原作者出处!