zoukankan      html  css  js  c++  java
  • 树链剖分的基本思想

    一、树链剖分的作用

      通常是求树上u到v的路径节点之和

      这个问题很容易可以想到设f[i]表示根节点到i节点的节点之和

      t=lca(u,v),然后可以把u->v划分为u->t+t->v-t;

      则有结论:u->v=f[u]+f[v]-2*f[t]+t,这样就可以求出来了

      但是加上u到v的路径上的节点值的修改的话,就必须用树链剖分了。。。

    二、几个概念:

      1.重儿子:一个节点的所有儿子中子树最大的那一个(相同任意取一个)

      2.轻儿子:除了重儿子以外的所有其他儿子

      3.重边:father连向重儿子的边

      4.轻边:除了重边以外的边

      5.重链:一条路径,上面全部都是由重儿子构成(即全为重边)

    三、几个推论:

      1.两条重链之间必然有一些轻边连接

      2.我们用一条重链的起始节点来表示一条重链(每个节点只会属于一条重链)

      3.bel[x]表示x节点的重链的开头节点

    四、问题的解决:

      首先对于修改操作,将lca(u,v)求出,然后判断bel[x]是否等于bel[y]

      1.如果等于,那就可以直接对一条重链上的节点进行修改

      2.如果不等于,那就把x和y同时跳到他们的重链的顶端,然后跨越轻边,继续刚才的过程

      其实上面的区间修改和区间查询可以用线段树来实现

  • 相关阅读:
    Android MulticastSocket IP组播
    IP组播技术介绍及实现例子
    机器学习:多变量线性回归
    慘挂阿里笔试题
    Android使用am命令实现拨打电话、打开应用
    社交O2O的进化
    hibernate4中HHH000273的错误
    Java中常见的排序算法
    Axure实现淡入淡出效果
    Ubuntu虚拟机+ROS+Android开发环境配置笔记
  • 原文地址:https://www.cnblogs.com/heqingyu/p/8159255.html
Copyright © 2011-2022 走看看