树链问题合集

做~自己de王妃 提交于 2019-11-29 13:14:53
树上差分

给一条链(u,v)加1,在u处+1,v处+1,LCA处-2。
用树状数组在dfs序上单点修改单点查询,但是修改是往前贡献,查询是往后查询,O(nlogn)O(nlogn)
如果询问都在修改之后可以直接树形DP由下往上传,O(n)O(n)
eg:BZOJ3631: [JLOI2014]松鼠的新家

查询一个点到根的路径的和

有时候链上问题可以转化成两点和lca到根的路径和问题。
如果是单点修改,用树状数组在dfs序上对子树差分,单点查询(即前缀和),O(nlogn)O(nlogn)
eg:BZOJ2819: Nim
如果还有子树修改,考虑修改一个点xx对它的子树中点yy的贡献:

  • 单点修改xx,加上aa,贡献为aa
  • 子树修改xx,子树加上aa,贡献为a(deep[y]deep[x]+1)=adeep[y]+a(1deep[x])a*(deep[y]-deep[x]+1)=a*deep[y]+a*(1-deep[x])

维护两个树状数组,一个存直接贡献(单点修改的a和子树修改的a*(1-deep[x])),一个存间接贡献(子树修改的a,求后乘上对应的deep)即可。
eg:BZOJ4034: [HAOI2015]树上操作

万能解法:树链剖分+线段树

无论是求和、异或、最大值、最小值、颜色段数、单点修改、子树修改、链修改统统一套搞定。。

链并

求几个点到根的链并可以将点按dfs序排序后每个点+1,相邻两点LCA-1。
求几条树链的并可以把每条链按树链剖分取dfs序区间,然后求区间并。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!