树链剖分模板

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值