1.给定一个树T,有点权,查询路径点权和
- 分析与解:树上前缀和:预处理每个点到根的路径:
d
i
s
[
i
]
dis[i]
dis[i]
- d i s ( x , y ) = d i s [ x ] + d i s [ y ] − d i s [ l c a ( x , y ) ] − d i s [ f a [ l c a ( x , y ) ] ] dis(x,y)=dis[x]+dis[y]-dis[lca(x,y)]-dis[fa[lca(x,y)]] dis(x,y)=dis[x]+dis[y]−dis[lca(x,y)]−dis[fa[lca(x,y)]]
2.给定一个树T,有点权,支持区间修改( ( x , y , v ) = x , y 之 间 的 路 径 边 权 + v ) (x,y,v)=x,y之间的路径边权+v) (x,y,v)=x,y之间的路径边权+v),查询单点点权
- 树上差分:预处理每个点到根的路径:
d
i
s
[
i
]
dis[i]
dis[i]
- 修改
(
x
,
y
,
v
)
:
(x,y,v):
(x,y,v):
- 1. d i s [ x ] + v 1.dis[x]+v 1.dis[x]+v
- 2. d i s [ y ] + v 2.dis[y]+v 2.dis[y]+v
- 3. d i s [ l c a ( x , y ) ] − v 3.dis[lca(x,y)]-v 3.dis[lca(x,y)]−v
- 4. d i s [ f a [ l c a ( x , y ) ] ] − v 4.dis[fa[lca(x,y)]]-v 4.dis[fa[lca(x,y)]]−v
- 查询x点权:查询x子树和
- 修改
(
x
,
y
,
v
)
:
(x,y,v):
(x,y,v):
3.给定一个树T,有边权,问有多少条路径异或和为0?
- 1.x到y的路径异或和=x到根的路径异或和异或y到根的路径异或和
- reason:正常x到y的路径异或和=x到根的路径异或和异或y到根的路径异或和去掉2^lca到根的路径异或和(=0!!!)
- 2.so,x到y的路径异或和为0means:x到根的路径异或和=y到根的路径异或和