关于树上差分

摘要:
在实际操作中,不必推送每次更新。只要保持四个tmp,Dfs将在其消失时更新。如图所示,边缘差:1。对于边缘差异,首先,除了一般的grand、depth和其他数组之外,我们还打开了两个数组:tmp和prev。Tmp用于记录点的出现次数,prev记录从每个点到其父点的边。这是一次手术。对于许多操作,我们只需要维护tmp,而不是每次都更新到根目录。维护tmp和Dfs一次。

关于树上差分,可参见网友一博客

https://www.luogu.com.cn/blog/sincereactor/shu-shang-ci-fen-di-liang-zhong-sai-lu

这里我也来说两句:

树上差分分为两个(就像树上dp一样)

1.点差分

2.边差分

1.点差分:
二.关于点的差分(如将路径上的所有点权值加一,求最后点的权值)

此操作中我们这样维护:每次经过一条边,(如从u到v)我们让tmp[u]++,tmp[v]++,tmp[LCA(u,v)]--,tmp[grand[LCA(u,v)][0]]--。(最后要把tmp推上去)

以一次添加为例想象一下,首先u到根的路径上tmp都+1,此时u到根间结点tmp都为1,之后v到根路径上tmp+1,此时u到LCA前一个,v到LCA前一个点的tmp都+1,而

LCA到根的所有点都+2,然后从tmp[LCA]--,更新上去,此时u-v路上所有tmp都+1,已经达到目的。

而多余的是什么部分呢,也就是LCA的上一个结点(grand[LCA][0])到根的这一段都多加了1,所以tmp[grand[LCA][0]]--,更新上去,也就完成了。

实际操作时也不需要每次更新都推上去,只要把四个tmp维护好,最后Dfs走一边就更新完了。

如图

关于树上差分第1张

关于边差分:

一.关于边的差分(如找被所有路径共同覆盖的边)

首先我们除了一般的grand,depth等数组以外,多开两个数组:tmp和prev。

tmp用来记录点的出现次数(具体点说实际上记录的是点到其父亲的边的出现次数),prev记录每个点到其父亲的那条边。对于一条起点s,终点t的路径。我们这样处理:

tmp[s]++,tmp[t]++,tmp[LCA(s,t)]-=2。(记住:最后要从所有叶结点把权值向上累加。)以一次操作为例,我们来看看效果(可以画一张图)。首先

tmp[s]++,一直推上去到根,这时候s到root的路径访问次数都+1,tmp[t]++后,t到lca路径加了1,s到lca路径加了1,而lca到根的路径加了2。

这时,我们只需要tmp[LCA(s,t)]-=2,推到根,就能把那些多余的路径减掉,达到想要的目的。而这是一次操作,对于很多次操作的话,我们只需要维护tmp,而不

必每次更新到根,维护好tmp最后Dfs一遍即可。这时如果tmp[i]==次数的话,说明i到其父亲的边是被所有路径覆盖的。如图

https://cdn.luogu.com.cn/upload/pic/20327.png

谢谢

免责声明:文章转载自《关于树上差分》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于Flask的 api(三)iOS开发UI篇—屏幕适配autoResizing autoLayout和sizeClass图文详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQLPLUS工具简介

1。 连接 database 远程连接,1)sqlplus /nolog –> conn hanaro@htnsdb –> 输入密码         2)sqlplus hanaro@htnsdb –> 输入密码 本地连接,1)使用本地管理员权限 sqlplus /nolog –> conn /as sysdba 不需要输入密码直...

linux(centos7) 常用命令和快捷键 持续验证更新中...

1、文件和目录cd 进入目录示例:cd /home 进入home目录    cd..    返回上一级目录cd../..    返回上两级目录cd -    返回上次所在目录cd ~    返回根目录cpcp file1 file1    文件复制cp-acp-a dir1 dir2    复制一个目录cp -a /tmp/dir1 .     复制一个目...

Linux /tmp目录下执行脚本失败提示Permission denied

Linux上执行具有可执行权限Shell脚本失败提示Permission denied问题的分析过程。 问题现象Linux /tmp目录下,执行./test.sh运行失败,提示Permission denied。 问题分析1、检查test.sh脚本是否有可执行权限。执行ls -al test.sh,权限为777。具有可执行权限。 2、尝试使用sh test...

QT_计算器的简单实现

1 2 //转换为后缀表达式,实现最主要功能 3 void MainWindow::toPostfix () 4 { 5 QString exp = ui->lineEdit->text (); 6 //QString exp = "0.3/(5*2+1)", postfix; 7 8 Q...

Linux中find常见用法示例

·find path -option [ -print ] [ -exec -ok command ] {} ; find命令的参数; pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。-print: find命令将匹配的文件输出到标准输出。-exec: find命令对匹配的文件执行该参数所给出的shell...

Shell命令合集

Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号cd 回到起始目录,也即刚登陆到系统的目录,cd后面无参数cd / 回到根目录cd .. 返回上一级目录 cd - 返回到最近使用的目录Ddf -kh 查看磁盘信息 du -sh foldername 查看文件夹大小,-h表...