树链剖分模板 边权、点权区别

熟练剖分详解见:https://blog.csdn.net/tangzhide123yy/article/details/77532880
熟练剖分一般有如下几个步骤:
1.dfs1()求出fa,deep,size,son
2.dfs2()求出top,p
3.add()/Query ()树链剖分核心部分
4.updata()线段树更新操作(如单点修改,区间修改)
5.query()线段树查询(如区间查询,单点查询)

建立线段树(维护点权)

inline void build(int l,int r,int rt){
  //建立一棵线段树 
    tr[rt].l=l,tr[rt].r=r;
    if(l==r){tr[rt].sum=w[id[l]];return ;}
    //w[]存储的为原始的点权,写为w[id[l]]是因为dfs时的顺序不一样
    int midd=l+(r-l)/2;
    build(l,midd,ls),build(midd+1,r,rs);
    pushup(rt);
}

dfs1()维护点权模板

inline void dfs1(int x,int fat,int dep) {
    //这里应该就是树链剖分的第一个操作,把树上每个节点的size,fa等统统搞出来
    deep[x]=dep,fa[x]=fat,sz[x]=1;//fat表示x的爸爸 
    for(int i=0;i<g[x].size();i++){
        int v=g[x][i];
        if(v!=fat){
            dfs1(v,x,dep+1);
            sz[x]+=sz[v];
//son[x]记录x的儿子中的重点 
        }
    }
}

dfs2()维护点权模板

inline void dfs2(int x,int tp){
  //这个操作应该就是处理轻链和重链 
    top[x]=tp;pos[x]=++cnt;id[pos[x]]=x;
    
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值