Construct Tree

官解写挺好

首先对\(l\)从小到大排序

如果\(l_n+l_{n-1}>d\),那么显然无解

如果\(l_n+l_{n-1}≤d\)

此时考虑一组边,长度总和为\(d\)

如果\(l_n\)包含在这组边里面,那么有一种构造方式如下

如果\(l_n\)不包含在任何一组这种边,那么我们一定要找到一组这样的边,使得这条直径上的一个点\(v\)(设这条直径的点是\(1,2,3,...,p\)),从\(1\)\(v\)的距离和从\(v\)\(p\)的距离都不比\(l_n\)小(如果找不到,那么\(l_n\)无论接在哪里,直径的长度都比\(d\)大,就无解了),此时可以把除了这组边的其他边都接在\(v\)上,就是一种方案

update 2024.7.10

重新做一遍,进步还是很大

首先观察样例就会发现我们先找出组成直径的边,然后剩下的边弄成类似菊花图的样子是最优的

于是就可以考虑直径的边是否包含最大边,于是就有上面的做法了

但是有一个问题,就是说当\(l_n\)不包含在直径的边中时,为什么随便找一组直径就能判断无解了,如果这组不行但是另一组行呢?

posted @ 2024-02-24 23:27  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报