本届NOIP的压轴题,一如既往的难度爆表。
题目:疫情控制。
(PS:由于题目较长,编辑后添加,不算字数)
【问题描述】(梗概):
有n个城市,用n-1条路互连,构成了一棵树。
1号城市是树中的根节点,现在,根节点上爆发了一种危害性极高的传染病。
为了不让疫情扩散到边境城市,也就是叶子节点,于是派出医疗队,在一些城市建立检查点。
目标:从1号城市到边境城市的每一条路径上,都至少要有一个检查点。
医疗队可以在有路互连的城市间移动,并在城市中建立检查点。
一支队伍只能在一个城市建立检查点,边境城市也可以建立检查点,但1号城市不能建立检查点。
医疗队移动所需时间,等于道路的长度,单位是小时。
一个城市可以驻扎多个医疗队,不同的医疗队可以同时移动。
现在,一些城市中已经驻扎有医疗队。
求解:最少需要多少个小时,才能控制住疫情。
【输入数据】:
第一行,一个整数n,表示城市个数;
接下来的n-1行,每行3个整数:u、v、w,表示从城市u到城市v有一条长为w的道路。
数据保证输入的是一棵树,且根节点编号为1。
下一行,一个整数m,表示医疗队的个数。
再下一行,有m个整数,分别表示m个医疗队所驻扎的城市编号,其中任意m≠1。
【输出格式】:
只有一个整数,表示控制疫情需要的最少时间,如果无法控制疫情则输出-1。
题目后面,还给出了一些输入输出的样例和解释。
最后,是这道题的数据范围。
对于20%的数据,2≤n≤10;
对于40%的数据,2≤n≤50,w大于0小于10^5;
对于60%的数据,2≤n≤1000,w大于0小于10^6;
对于80%的数据,2≤n≤10,000;
对于100%的数据,2≤m≤n≤50,000,w大于0小于10^9。
这很可能是最近几年来最难的一道题,思考难度超大。
即使在NOIP历史上,也足可以排进难度榜三甲。
而且有个很恶心的条件,不能停留在根节点。
写代码的时候,一不小心就容易出错。
至于解题思路……
江寒全力开动脑筋,花了10分钟时间,才理顺了过来。
医疗队可以同时移动,说明需要的总时间,取决于移动距离最长的医疗队。
根据题意,需要最小化最大值。
不能用模拟的办法,容易超过时限。
江寒看懂题意后,第一个念头就是二分答案。
求最大化最小值,最小化最大值,一般都可用二分答案。
然后,可以在二分之后,使用贪心策略,将所有的医疗队尽可能上提。
但是,数据范围太大了,直接一个个“上提”,肯定会导致TLE(超时)。