如果没有时间的限制,这题就是对每个点 i i i,求经过 i i i的路径数,用树上差分解决即可:
枚举路径 x → y { x\to y\{ x→y{
a [ x ] + = 1 ; a [ y ] + = 1 ; a[x]+=1;a[y]+=1; a[x]+=1;a[y]+=1;
a [ l c a ( x , y ) ] − = 1 ; a [ f a [ l c a ( x , y ) ] ] − = 2 ; a[lca(x,y)]-=1;a[fa[lca(x,y)]]-=2; a[lca(x,y)]−=1;a[fa[lca(x,y)]]−=2;
} \} }
枚举点 i { i\{ i{
经过 i i i的路径数 = 以 i i i为根的子树中 a a a的和
} \} }
(用树状数组实现)
考虑加上时间限制怎么做:
我们把每条路径 x → y x\to y x→y拆成上行段和下行段。
-
若点 i i i在 x → y x\to y x→y的上行段上,
i i i点的观察员看到从 x x x出发跑到 y y y的玩家,当且仅当
d e p [ x ] − d e p [ i ] = w [ i ] dep[x]-dep[i]=w[i] dep[x]−dep[i]=w[i]即 d e p [ i ] + w [ i ] = d e p [ x ] dep[i]+w[i]=dep[x] dep[i]+w[i]=dep[x] -
若点 i i i在 x → y x\to y x→y的下行段上,
i i i点的观察员看到从 x x x出发跑到 y y y的玩家,当且仅当
d e p [ x ] + d e p [ y ] − 2 d e p [ l c a ( x , y ) ] − ( d e p