给你一棵树和边权,有若干条航线,从树上的一个点到另一个点。令运输时间为所有航线所需要的时间中的最长时间。你可以将某一条边的权值变为0,求这个最长时间的最小值。
6 3 1 2 3 1 6 4 3 1 7 4 3 6 3 5 5 3 6 2 5 4 5
11
先讲一下部分分毕竟这是一道联赛题。 1、首先想到就是预处理lca,然后枚举变为0的边计算每条航线的权值,时间复杂度为n^2,可以过掉10个点。 2、考虑到m=1只有一条航线,直接找链上的最大值即可,这又有2个点。 3、对于单链的情况,首先这个题目的问法就是让你二分答案。然后我们考虑如何check一个答案。我们假设check的答案为x,预处理每条航线的长度,然后把所有大于x的航线全部放到单链上,如果存在这样一条边,使得所有大于x的航线都经过,并且最长的航线减去这条边的权值小于等于x,这就意味着如果把这条边的权值变为0,所有的航线长度都是小于等于x的,那么这个x就是可行的。这里“把所有大于x的航线全部放到单链上”用到了差分的方法,每次只要对起点和终点操作,时间复杂度为nlogn。这样可以过掉8个点。 结合1、2、3可以过掉16个点。 4、其实上面已经说了单链的做法,那么只要对树剖分一下就可以满分了。最后一个点略微卡常,我用了读入优化后在bzoj和uoj上都是跑得过去的,不过ccf的老爷机听说要被卡掉一个点。
新闻热点
疑难解答