//链式前向星版
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
//建图
int to[maxn*2],nex[maxn*2],beg[maxn],tot;
//树剖预处理
int fa[maxn],dis[maxn],siz[maxn],son[maxn];
//树剖成一条链
int top[maxn], id[maxn],ran[maxn],cnt;
//线段树
int Max[maxn<<2];
int n,q;
//添加边
void add(int x,int y){
to[++tot]=y;
nex[tot]=beg[x];
beg[x]=tot;
}
//树剖预处理
void dfs1(int rt,int ba){
siz[rt]=1;
dis[rt]=dis[ba]+1;
for(int i=beg[rt];i;i=nex[i]){
int u=to[i];
if(u!=ba){
fa[u]=rt;
dfs1(u,rt);
siz[rt]+=siz[u];
if(siz[u]>siz[son[rt]])son[rt]=u;
}
}
}
//树剖成一条链
void dfs2(int rt,int tp){
top[rt]=tp;
id[++cnt]=rt;
ran[rt]=cnt;
if(son[rt])dfs2(son[rt],tp);
for(int i=beg[rt];i;i=nex[i]){
int u=to[i];
if(u!=son[rt] && u!=fa[rt])
dfs2(u,u);
}
}
//线段树更新
void update(int rt,int l
ural 1553 树剖+线段树
于 2022-03-22 19:35:05 首次发布
本文详细介绍了链式前向星数据结构的实现,包括建图、树剖预处理、树剖成链以及线段树的应用。通过实例展示了如何在实际问题中使用这种方法进行查询优化,适合前端与后端开发者理解和掌握。

最低0.47元/天 解锁文章
732

被折叠的 条评论
为什么被折叠?



