差分: 与前缀和背道而驰的算法, 给你一个数列, 要求在数组下标在 [ l , r ] [l,r] [l,r]范围内的数同时 + x +x +x, 那么只需在差分数组 a [ l ] + x , a [ r + 1 ] − x a[l]+x,a[r + 1]-x a[l]+x,a[r+1]−x, 最后 ∑ i = 1 j a [ i ] \displaystyle\sum_{i=1}^{j}a[i] i=1∑ja[i]就是原数组 a r r [ j ] arr[j] arr[j]变化之后的值.
树上差分和最近公共祖先是两兄弟, 缺一不可
树上差分分为两种, 一种为边差分, 一种为点差分.
边差分:在经过 u u u到 v v v的路径上, 每条边的权值 + x +x +x, 最后求两节点的距离, 或者边被经过的次数, 我们只需使 d [ u ] + x , d [ v ] + x , d [ l c a ( u , v ) ] − 2 ∗ x d[u]+x,d[v]+x,d[lca(u,v)]-2*x d[u]+x,d[v]+x,d[lca(u,v)]−2∗x, 这里的lca指的是, 树上两节点的最小公共祖先, 这样就使得加 x x x的效果只局限在 u . . v u..v u..v,不会向 l c a ( u , v ) lca(u,v) lca(u,v)的爸爸蔓延。
点差分:在经过 u u u到 v v v的路径上, 每个节点的权值 + x +x +x,最后求节点的最大权值.我们只需使 d [ u ] + x , d [ v ] + x , d [ l c a ( u , v ) ] − x , d [ l c a ( u , v ) 的 父 节 点 ] − x d[u]+x,d[v]+x,d[lca(u,v)]-x,d[lca(u,v)的父节点]-x d[u]+x,d[v]+x,d[lca(u,v)]−x,d[lca(u,v)的父节点]−x.因为 l c a ( u , v ) lca(u,v) lca(u,v)这个节点也需要 + x +x +x,而从 u u u到 l c a ( u , v ) lca(u,v) lca(
树上差分(求法与练习)
最新推荐文章于 2024-03-13 20:31:41 发布