浅谈树上差分

浅谈树上差分

【引子】

我们遇到一些关于树的问题时,往往需要我们统计一些树上的信息,比如子树和,路径边覆盖、点覆盖(目前没见过别的类型)。暴力的解法当然是遍历逐个点对其权值进行修改。

类比序列问题,其在进行区间修改时,可以用差分将\(O(n)\)复杂度降为\(O(1)\)。在树上我们是对一条链进行处理,那差分在树上可不可用呢?答案是肯定的。

【从序列到树】

在一个序列上进行差分的操作,相信各位都十分熟悉:假设当前我们要对一个序列的\(l\sim r\)区间的每个数执行\(+k\)操作,那么对于差分数组,我们在\(l\)位置\(+k\),表示从\(l\)开始有一个\(+k\)的影响,在\(r+1\)位置\(-k\),表示在\(r+1\)这个位置影响被消除。这个影响是从序列首端传递到序列尾端的

首先我们要明白,对于一条树上的链,假设其起点为\(s\),终点为\(t\),其一定可以分为两部分:\(s\sim lca(s,t),lca(s,t)\sim t\)。或者说,对于任意一棵树,对于点对\((s,t)\),它所表示的路径是唯一的

感性的理解一下,由于树上的任意点只存在一个父节点,那么如果这个点不断向父节点移动,路径就是唯一的。那么对于一个点对,这两个点不断向上移动,减少深度的时候,就一定会相遇,我们叫这个相遇的点“最近公共祖先”,也就是LCA。

【树上差分】

那么如果我们将差分技巧拓展到树上会如何呢?差分的核心思想是某种影响的产生与消除。显然,对于一条树链,它的影响产生于\(s\),消除于\(t\)。但是,一棵树上有那么多条链,如果这样进行差分的话,最后如何统计整棵树的点的权值呢?

既然单独对一条条链进行差分无法达到要求,那我们不妨把整棵树作为一个差分的对象。上文提到,任意点的父节点只有一个,也就是说任意点到根节点的路径也是唯一的。如果我们把根节点那边类比做序列尾端,把叶子节点那边类比做序列首端,那这样的话,这个影响不就能自底向上传递了吗?

具体地说,如果我们有差分数组\(c[]\),对于任意一棵树,假设我们要对\(s\sim t\)这条路径上的所有点执行\(+1\)操作,那么我们就在\(c[s]+1\),在\(c[t]+1\),在\(c[lca(s,t)]-1\),在\(c[father(lca(s,t))]-1\)。然后我们自底向上传递信息,意即对于节点\(x\),假设它的子节点集合为\(son\),子树和为\(ans[x]\),那么有\(ans[x]=c[x]+\sum c[i],i\in son\)。这个信息是从叶子节点逐层向上传递的。

对于任意多个点对\((s,t)\)的询问,我们重复上述差分操作,最后进行自底向上的统计即可。

讨论完了点覆盖的情形,我们来考虑边覆盖。点覆盖与边覆盖唯一的区别就在于当前子树的根节点是否计算在内。显然,点覆盖的情况是包含根节点的,而边覆盖是不包含的。因此,我们只需稍稍修改差分操作:在\(c[s]+1\),在\(c[t]+1\),在\(c[lca(s,t)]-2\)。最后进行统计即可。

几道例题

P3128

一道裸题,适合入门树上差分,非常简单。

P2608

一道结合了一点点别的东西的树上差分裸题,需要一点思维量,还算比较简单。

P4556

涉及到线段树合并,建议去学,正常难度的题目。当然如果你会树剖就当我没说。

P1600

啊我死了。

【扯点淡】

最近真是越来越常考树论了。。。特别是树上差分老是考,我的建议是学树剖或者LCT,便于成为调参带湿。其实会树上差分也差不多够用了,多学点也没负面影响。主要是倍增LCA常数感人,好在NOIpCSP似乎并不会卡。

原文地址:https://www.cnblogs.com/DarkValkyrie/p/11625846.html

时间: 2024-11-07 17:16:41

浅谈树上差分的相关文章

浅谈树上差分的具体应用

树上差分利用前缀和的思想,利用树上的前缀(也就是子树和),记录树上的一些信息,因为它可以进行离线操作,复杂度O(n),也是非常的好用. 最大流 FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道连通了. FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间ti.一条运输路线会给它的两个端点处的隔间以及中间途径的所有隔间带来一个单位的运输压力,你需要计算压力最大的隔间的压力是多少. 这道题需要让我们求出每个点的覆

浅谈对差分隐私的理解

在听完第五组的报告之后,浅谈一下对差分隐私的认识,主要针对差分隐私的思想做一个大致的梳理. 为什么会产生差分隐私? 由于有些“聪明”的用户为了知道某些信息,可以通过两次查询结果的差异进行对比,从而在两次数据的对比中找到有用的信息.正如在杨顼组的报告中提到的查询二等兵约瑟夫阿伦是否阵亡的信息,可以通过查询D5和D6两次数据结果,将两次数据结果进行对比就可以知道约瑟夫阿伦是否阵亡的消息. 差分隐私的主要思想: 差分隐私是基于噪音的安全计算方法,它的思想是:对计算过程用噪音干扰,让原始数据淹没在噪音中

浅谈差分约束系统——图论不等式的变形

浅谈差分约束系统——图论不等式的变形 ----yangyaojia 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 一.定义 如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统. 二.分析 简单来说就是给你n个变量,给m个形如x[i]-x[j]≥k①或x[i]-x[j]≤k②.求两

浅谈未来网站的构建

前言: 话说"合久必分,分久必合",从过去的几年来看我们现在正处于一个资源.信息技术和服务等整合的时代,从行业到技术,从电子商务到企业资源,那么对于现存的网站如何进行整合,未来的网站将以什么形式展现在人们面前,与现在相比又给人们带来哪些不同的用户体验呢,本文作者站在个人角度,结合近年来出现的技术,对于未来的网站发表下个人见解. 随着各行业信息化进程的加快,各种功能的网站应运而生,工作.购物.学习.娱乐.医疗.金融和社交等网站都层出不穷,由于这些网站的出现,给人们生活带来很大的方面, 人

【转】浅谈React、Flux 与 Redux

本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成单向的数据流 根据 state 的变化来更新 view 利用虚拟 DOM 来提升渲染性能 前面说到 React 能够根据 state 的变化来更新 view,一般来说引起 state 变化的动作除了来自外部(如服务器),大部分都来自于页面上的用户活动,那页面上的用户活动怎样对 state 产生作用呢?Reac

浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍的二叉查找树(Binary Search Tree,BST)这一数据结构综合了以上两种数据结构的优点. 二叉查找树具有很高的灵活性,对其优化可以生成平衡二叉树,红黑树等高效的查找和插入数据结构,后文会一一介绍. 一 定义 二叉查找树(B

XJOI CBH的发展计划(树上差分)

这是qzh的第二题 题目大意: 给你一棵树和一些连接祖先和孩子的边(非树枝边,类似于有向图返祖边) 让你求出删掉其中一条树枝边和一条非树枝边使图不联通的方案数 我们思考对树枝边统计答案 如图 对于红边统计答案,它的子树中有一条向外连的边,必须删掉红边和这条边才能使图不连通,所以这条树枝边贡献为1 如图 对于红边统计答案,它的子树中有0条向外连的边,删掉红边和任意一条虚线边能使图不连通,所以这条树枝边贡献为非树枝边的数量 如图 对于红边统计答案,它的子树中有两条及以上向外连的边,删掉红边和任意一条

【转载】李航博士的《浅谈我对机器学习的理解》 机器学习与自然语言处理

李航博士的<浅谈我对机器学习的理解> 机器学习与自然语言处理 [日期:2015-01-14] 来源:新浪长微博  作者: 李航 [字体:大 中 小] 算算时间,从开始到现在,做机器学习算法也将近八个月了.虽然还没有达到融会贯通的地步,但至少在熟悉了算法的流程后,我在算法的选择和创造能力上有了不小的提升.实话说,机器学习很难,非常难,要做到完全了解算法的流程.特点.实现方法,并在正确的数据面前选择正确的方法再进行优化得到最优效果,我觉得没有个八年十年的刻苦钻研是不可能的事情.其实整个人工智能范畴

浅谈可持久化数据结构

Preface 由于我真的是太弱了,所以真的是浅谈. 神奇的数据结构其实我也很虚啊! 值域线段树 简单的说,值域线段树区间里面存的是在这个区间内的数的个数有多少个. 有没有感觉很简单,考虑一下如果我们有一棵这样的线段树,查找排名为rk的数时只需要看一下左子树的大小就可以判断在左边还是右边了. 有没有感觉很像BST 动态开点与可持久化 根据上面的值域线段树,我们可以得出一种naive的做法: 对于每一个前缀\([1,i](i\in[1,n])\)都开一棵值域线段树,然后查询区间的时候直接每个节点的