树上路径!!!点分治处理。(就是在树上分治处理,把树分成小树,再分成更小的树处理)
找最小的满足>=S 并且<=E的路径。
假设从随便一个点开始dfs,复杂度o(n);
然而从重心开始dfs,复杂度为O(logn);
重心:删掉这个点以后,剩余的森林的最大的size最小的点。
注意一下:合并路径时,两条路径不能有相同的祖先(处理某点,路径必须是过这个点,且路径的两端点不在同一棵子树的)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int tp, tov[200005], tow[200005], nex[200005], h[100005], n, m, ans = 1e9;
int siz[200005], ma[200005], mama = 1e9, vis[200050],s, e, ss, zong,root,k,zhan[2000005],top;
void read(int &x)
{
x = 0;
int f = 0;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == &#