题意:给你一棵树,q对点,要求每次从qx走到qy的花费为最大路径权值,可以把一条边减小L,问最少花费。
= =简单题,比赛的时候只是扫了一眼,觉得应该是树剖裸题,然后就放了= =
事实上也可以用树剖来做,但是非常复杂,难以维护。
倍增就好了,和那个次小生成树一样,维护一个每个点往上2^i的路径的最大次大权值。然后那个L的那个东西,我每次在求一对点的LCA过程中,直接用已经求出的最大次大维护,然后最后把最大边拉出来记录一下,最后把所有边扫一遍+不改边的贡献就ok。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e5+5;
const int inf=2e9;
typedef long long ll;
int n,m,q,l;
int fa[N][22],head[N],next[N],go[N],val[N];
int dep[N];
ll ans,sum[N];
int mx[N][22