#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm>
#include <string>
#define LL long long
#define EPS (1e-8)
#define INF 0x3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int MAXN = 100100;
struct N
{
int v,next;
} edge[MAXN*2];
int head[MAXN];
int Top;
void Link(int u,int v)
{
edge[Top].v = v , edge[Top].next = head[u] , head[u] = Top++;
}
int Top_E;
int siz[MAXN],fa[MAXN],son[MAXN],dot_site[MAXN],dep[MAXN],top[MAXN],seg[MAXN];
int que[MAXN];
void dfs1(int s)
{
int L = 0 ,R = 0,p,now,v;
fa[s] = -1,dep[s] = 1,siz[s] = 1,son[s] = -1;
que[R++] = s;
while(L < R)
{
now = que[L++];
for(p = head[now]; p != -1; p = edge[p].next)
{
v = edge[p].v;
if(v != fa[now])
{
fa[v] = now,dep[v] = dep[now]+1,siz[v] = 1,son[v] = -1;
que[R++] = v;
}
}
}
for(L = R-1; L >= 0; --L)
{
now = que[L];
v = fa[now];
if(son[v] == -1 || siz[son[v]] < siz[now])
son[v] = now;
siz[v] = max(siz[v],siz[now] + 1);
}
}
void dfs2(int s,int pre,int T)
{
top[s] = T , dot_site[s] = ++Top_E , seg[Top_E] = s ;
if(son[s] == -1)
return ;
dfs2(son[s],s,T);
for(int p = head[s] ; p != -1; p = edge[p].next)
{
if(edge[p].v != son[s] && edge[p].v != pre)
{
dfs2(edge[p].v,s,edge[p].v);
}
}
}
void Split()
{
dfs1(1);
Top_E = 0;
dfs2(1,-1,1);
}
树链剖分模板
最新推荐文章于 2025-03-08 16:05:21 发布