想到了把1~n的链拉出来,但是再往下就想不走了。经常把题目搞混,明明是要最大化最短路,我老想着最短化最短路,,反正各种扯,我们来慢慢扯这道题。
首先如果链上某个节点有超过1个非链上的“子”节点,那么直接在这至少两个的“子”节点上连边,最短路不变,这已经是最优的答案了。所以我们只需要考虑,每个链上的节点(除了1,n)至多有1个非链“子” 节点的情况,分了三种。(建议画图理解)
第一种是在链上连两个点,这两个点中间隔了一个点(题目说不能连在已经直接相连的两个点之间),这样能最大化最短路,这种情况只需要找出链上相邻的两条边的最大值就好了
第二种是一个“子”节点连一个链上节点,“子”节点的父亲和该链上节点一定相邻(为了最大化最短路),并且该链上节点一定没有“子”节点(写的时候不用考虑这个,我只是提一下)这个也只要预处理出来就好了。
第三种是两个“子”节点相连,他们的父亲在链上也是相邻的吗?应该不是的,假设他们到父亲的距离分别为l1,l2,父亲之间的距离是l3要加的边是l,就是要最小化 l+l1+l2-l3,也就是要预处理最小化 l1+l2-l3,这个从左往右扫一遍就可以了(记录最小值,遇到一个点先更新答案,往右移动的时候减一个距离,再跟当前点比较)
然后每个询问是O(1)的。。。真**恐怖。
代码没写,嘴巴选手(雾