Misha, Grisha and Underground
原题:Misha, Grisha and Underground
原题大意给一棵树,在给给出3个点s,f,t问s到f与t到f经过相同的点有几个?输出最多的那种sft组合。
算法分析分情况讨论:
f是s的祖先,t在f到s的外面
f是s的祖先,t在f到s的路径上
s->lca(f,s)->f,lca(s,t)在s->lca(f,s)上
s->lca(f,s)->f,lca(f,t)在lca(f,s)->f上
另一种取巧的做法是(lca(a,b) + lca(c,b) - lca(a,c))/2
程序代码#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define pb push_back
const int maxn=100005;
int n, q;
int fir[maxn],no[2*maxn],se[2*maxn],st[2*maxn][20],lo[200005],dep[maxn];
bool
...