[JLOI2009]二叉树问题 - 洛谷https://www.luogu.com.cn/problem/P3884
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
#include <cctype>
#include <cstdlib>
#include <deque>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
int fa[MAXN];
int d[MAXN];
int l[MAXN];
int depth, length, disu, disv;
inline void find(int u, int v) {
if (u == v) {
printf("%d", disu * 2 + disv);
return ;
}
if (d[u] == d[v]) {
v = fa[v];
u = fa[u];
disu++;
disv++;
} else if (d[u] > d[v]) {
u = fa[u];
disu++;
} else {
v = fa[v];
disv++;
}
find(u, v);
}
int main() {
int n;
scanf("%d", &n);
int u, v;
d[1] = 1;
for (int i = 2; i <= n; i++) {
scanf("%d %d", &u, &v);
fa[v] = u;
d[v] = d[u] + 1;
l[d[v]]++;
depth = max(depth, d[v]);
length = max(length, l[d[v]]);
}
printf("%d\n%d\n", depth, length);
scanf("%d %d", &u, &v);
find(u, v);
return 0;
}