首页 > 其他分享 >树上差分

树上差分

时间:2024-11-07 19:41:20浏览次数:1  
标签:++ 路径 差分 权值 树上 节点

近年的NOIP,对于树上差分的题目时有出现:(NOIP 2015《运输计划》,NOIP2016《天天爱跑步》)。

这些题目都要知道在树上从某个点到另一个点的所有路径。

但是,暴力求解这种题目经常会TLE。

这种题目需要使用树上差分。

在讲树上差分之前,首先需要知道树的以下两个性质: 

  • 任意两个节点之间有且只有一条路径。
  • 一个节点只有一个父亲节点

所以:如果假设我们要考虑的是从u到v的路径,u与v的lca是a,那么很明显,我们可以将路径拆分成两条链,u→a和a→v。那么树上差分有两种常见形式:

  • 关于边的差分;
  • 关于节点的差分。

树上差分
树上差分有两种实现方法,第一种是转换为线性差分,第二种是利用最近公共祖先(lca)进行差分。第一种方法用于修改子树,第二种方法用于修改路径

  • 第一种差分

求出dfs序,以dfs序为基础进行差分

修改以i为根的子树的权值,在dfs序中相当于修改连续区间,可以O(1)实现

统计每个节点的权值,即求前缀和

  • 第二种差分

直接进行差分,但差分维护的是每个点到根节点的路径

修改i到根路径上的权值,只要修改d[i]即可,复杂度O(1)

修改从x到y路径上的权值,可以先求它们的lca点z,将d[x]和d[y]分别相加,再减去2*d[z]即可,复杂度O(1)

统计每个节点的权值,即dfs求子树的差分和,时间复杂度O(n)

  • 关于边(边(u,fa(u))信息记在节点x上)的差分:

将边拆成两条链之后,我们便可以像差分一样来找到路径了。

因为关于边的差分,a是不在其中的,所以考虑链u→a,则就要使d[u]++,d[a]--。

然后链v→a,也是d[v]++,d[a]--。

所以合起来便是d[u]++,d[v]++,d[a]-=2。

关于边(边(u,fa(u))信息记在节点u上)的差分:
从根节点,对于每一个节点x,都有如下的步骤:

  1. 枚举x的所有子节点u
  2. dfs所有子节点u
  3. d[x]+=d[u]
    因为每个点都只会遍历一次, 所以其时间复杂度为O(n).

image

  • 关于点的差分:

还是与和边的差分一样,对于所要求的路径,拆分成两条链。

步骤也和上面一样,但是也有一些不同,因为关于点,u与v的lca是需要包括进去的,所以要把lca包括在某一条链中,最后对d数组的操作便是d[u]++,d[v]++,d[a]--,d[father[a]]--。

其时间复杂度也是一样的O(n)。

标签:++,路径,差分,权值,树上,节点
From: https://www.cnblogs.com/mengxiaolong/p/18533850

相关文章

  • 计算机毕业设计Python+大模型新能源汽车销量预测 汽车销量分析可视化 汽车爬虫 深度学
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • 政策评价模型——双重差分DID模型
    政策评估(PolicyEvaluation)在公共经济学和劳动经济学中广泛应用,主要用于评价已实施政策的效果。其核心目的是评估政策的处理效应(TreatmentEffect),即该政策对特定目标人群的实际影响。通常情况下,政策的实施往往仅针对特定人群,如低收入家庭、特定行业或区域。为了评估政策的影响,政......
  • 一维差分模板
    一维差分模板题目描述:输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[l,r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式:第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包......
  • 差分与等差数列问题
    利用差分的思想解决多次对数组区间加相同数,或者加一个等差数列最好思路:从目标数列往前推两次前缀和,反推差分数组应该怎么加  #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m,l,r,s,e,d,maxv,ans;inta[10000005],sum[10000005];sig......
  • 显式差分和隐式差分
    目录显式差分法隐式差分法程序实现显式差分法隐式差分法1.时间导数的处理方式2.稳定性3.计算复杂度4.适用性5.数值耗散和色散波动方程是物理学中描述波的传播的偏微分方程,其一般形式为:\[\frac{\partial^2u}{\partialt^2}=c^2\nabla^2u\]其中$u$是波函数,$t$......
  • 强化学习的数学原理-07时序差分方法
    目录引入TDlearingofstatevaluesTDlearingofactionvaluesSarsaTDlearingofactionvaluesExpectedSarsaTDlearingofactionvaluesn-stepSarsaTDlearingofoptimalactionvalues:Q-learningaunifiedpointofview引入这三个例子是层层递进的,都可以用\(R......
  • 树上倍增下的 LCA 问题
    LCA,最近公共祖先问题。给定一颗有根树,若节点k既是节点x的祖先,又是节点y的祖先,则称k是\(\lbrackx,y\rbrack\)的公共祖先。在\(\lbrackx,y\rbrack\)的所有公共祖先中,深度最大的称为最近公共祖先,记作\(\operatorname*{LCA}(x,y)\)。\(\operatorname*{LCA}(x,y......
  • 【C++ 图论 DFS】1443. 收集树上所有苹果的最少时间|1682
    本文涉及知识点C++图论C++DFSLeetCode1443.收集树上所有苹果的最少时间给你一棵有n个节点的无向树,节点编号为0到n-1,它们中有一些节点有苹果。通过树上的一条边,需要花费1秒钟。你从节点0出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点0。无向......
  • 小红的树上路径查询(hard)
    小红的树上路径查询(hard)题目描述本题和$hard$难度的区别是,询问的次数有多次!小红拿到了一棵树,她有多次询问,每次询问输入一条简单路径$x,y$,她想知道树上所有节点到该路径的最短路之和是多少,你能帮帮她吗?定义节点到路径的最短路为:节点到路径上所有点的最短路中,值最小的那个。......
  • 差分矩阵
    输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1,y1,x2,y2,c,其中(x1,y1)和(x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上c。#include<iostream>usingnamespacestd;intnum[1010][1010],hou[1010][1010......