树上启发式合并模板
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;
vector<int> e[maxn];
int n;
int L[maxn],R[maxn],dfn[maxn],node[maxn],cur,big[maxn],sz[maxn];
int ans[maxn];
void dfs1(int now,int lst) {
L[now]=dfn[now]=++cur;
node[cur]=now;
sz[now]=1;
for (int nxt:e[now]) if (lst!=nxt) {
dfs1(nxt,now);
sz[now]+=sz[nxt];
if (!big[now]||sz[big[now]]<sz[nxt]) big[now]=nxt;
}
R[now]=cur;
}
void add(int x) {
// 添加节点x的信息到全局数据结构
}
void del(int x) {
// 从全局数据结构中删除节点x的信息
}
void update_ans(int now) {
// 更新当前节点的答案
}
void dfs2(int now,int lst,int S) {
for (int nxt:e[now]) {
if (nxt==lst||nxt==big[now]) continue;
dfs2(nxt,now,0);
ans[now]=max(ans[now],ans[nxt]);
}
if (big[now]) {
dfs2(big[now],now,1);
ans[now]=max(ans[now],ans[big[now]]);
}
add(now);
for (int nxt:e[now]) {
if (nxt==lst||nxt==big[now]) continue;
for (int i=L[nxt];i<=R[nxt];i++) {
add(node[i]);
}
}
update_ans(now);
if (!S) for (int i=L[now];i<=R[now];i++)
del(node[i]);
}
void solve() {
cin>>n;
for (int i=1;i<n;i++) {
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1,0);
dfs2(1,0,0);
}
int main() {
ios::sync_with_stdio(0);
int t=1;
// cin>>t;
while (t--) solve();
}