zoukankan      html  css  js  c++  java
  • 树上差分

    算法详解

    作用

    区间修改u到v最短路径上的点权或边权

    做法

    前置知识:LCA(很重要)

    顾名思义,就是树上的差分,说了和没说一样

    先把重要的摆在前面:

    树上差分是自底向上的!!!自底向上的!!!自底向上的!!!

    为什么呢?

    先回忆一下差分:对于区间[l,r],每个数加上d,那么我们定义查分数组为dat,则dat[l]+=d,dat[r+1]-=d

    一棵树,一个点有很多个子结点,但是只有一个父节点,如果我们自顶向下做差分以及前缀和,如果点u被修改了,以u为根的整颗子树都会被影响,要抵消影响,就要访问u的每一个子结点,就意味着还是不能做到O(1)修改,还不如暴力(还不能理解的自己想想或者写一写就知道了,其实我表达也不是很到位).但是,如果我们采用自底向上,被影响的只有u的祖先结点,很明显,是一条链的结构,我们只需访问u的某个祖先结点v就可以实现区间修改u到v最短路径上的数据.

    如果u和v不存在祖先关系呢?LCA就要派上用场了,修改u到v的最短路径上dat值就是分别修改u到lca(u,v)和v到lca(u,v)的dat值(lca(u,v)必定在u到v的最短路径上)

    最后通过dfs遍历每一个点求出改点被修改后实际权值即可

    例题

    进去后直接跳到第二题"小王子",不要看完整的题目(题面很长且不好理解要求什么)!!!

    传送门

    推一篇博客(写得真的很好)

    传送门

  • 相关阅读:
    Repo介绍
    =vscode========》快捷键
    linux c延时程序大全
    Linux vi/vim
    =vscode========》实用小技巧
    编程中闰年判断条件
    代码质量的评价标准
    Python如何计算编辑距离?
    python 格式化输出保留一位小数
    字符串拆分 split()方法
  • 原文地址:https://www.cnblogs.com/dream1024/p/13957859.html
Copyright © 2011-2022 走看看