题目大意:给出一棵带边权的树和m条路径,可以将一条边的边权变成0,求问最长的路径最短是多少。
题解:
暴力算法:将每条边变不变,用数据结构维护,更新答案。
这样显然过不掉。
通常最值问题考虑贪心和二分答案,这里我们使用二分答案,二分最长的路径是多少。
假如最长路径maxn<=当前二分的值mid,那么结果显然可行。
如果maxn-mid可以通过将一条边的边权变成0来消去,即这条边的边权>=maxn-mid,那么结果也可行。
现在问题转化成:路径长度>mid的所有路径中,是否存在一条公共边,满足这条公共边的边权>=maxn-mid。
如何判断公共边呢?我们记一下每条边经过的次数,如果经过次数等于路径数,则说明这条边是公共边。
经过次数用树上查分来维护就好。
可是你会发现你会被卡常。。。
在这里给出几个优化的方法:
1.快速读入。
2.缩小l和r的范围,由于只能将一条边的边权变成0,所以左边界是最长路径maxn-最大边权tmp,右边界就是最长路径maxn。
3.有很多时间是花费在求LCA上,预处理出每条路径两个端点的LCA。
当然还有更毒瘤的优化方式,这里就不一一赘述了。
#include
#include
#include
#include
#include
#include