西克
把 x → y x\to y x→y 拆成 x → l c a → y x\to lca\to y x→lca→y,而 x → l c a x\to lca x→lca 的部分很好搞,不予阐述。
关键是 y → l c a y\to lca y→lca 的部分,我们考虑离线解决。从上往下走时,对每种颜色 c c c 维护一个点 r t c rt_c rtc,表示当前对于 c c c 的询问。每当走到 x x x 时,就把 r t a x rt_{a_x} rtax 的父亲指向 r t b x rt_{b_x} rtbx,并且把 r t a x rt_{a_x} rtax 设为一个新的点用于处理下面对 a x a_x ax 的询问。然后对于某个询问 ( x , y , l c a ) (x,y,lca) (x,y,lca)(假设 x → l c a x\to lca x→lca 走出来是颜色 c c c),就在走到 l c a lca lca 时记录一下当前的 r t c rt_{c} rtc 记为 q r qr qr,然后走到 y y y 的时候询问一下 q r qr qr 的根所对应的颜色即可。
用可撤销并查集维护,时间复杂度 O ( ( n + q ) log n ) O((n+q)\log n) O((n+q)logn)。
尼特
只讲下面这个 DP 式子的生成函数怎么维护:
f
i
,
j
=
{
a
f
i
−
1
,
j
+
1
+
b
f
i
−
1
,
j
+
c
f
i
−
1
,
j
−
1
j
>
0
b
f
i
−
1
,
j
+
(
a
+
c
)
f
i
−
1
,
j
+
1
j
=
0
f_{i,j}= \begin{cases} af_{i-1,j+1}+bf_{i-1,j}+cf_{i-1,j-1} & j>0\\ bf_{i-1,j}+(a+c)f_{i-1,j+1} & j=0 \end{cases}
fi,j={afi−1,j+1+bfi−1,j+cfi−1,j−1bfi−1,j+(a+c)fi−1,j+1j>0j=0
关键是
j
=
0
j=0
j=0 时的特殊处理。
一个很巧妙的方法是我们设
F
n
(
x
)
F_n(x)
Fn(x) 为数列
{
f
n
,
n
,
f
n
,
n
−
1
,
⋯
,
f
n
,
1
,
f
n
,
0
,
f
n
,
0
,
f
n
,
1
,
⋯
,
f
n
,
n
−
1
,
f
n
,
n
}
\{f_{n,n},f_{n,n-1},\cdots,f_{n,1},f_{n,0},f_{n,0},f_{n,1},\cdots,f_{n,n-1},f_{n,n}\}
{fn,n,fn,n−1,⋯,fn,1,fn,0,fn,0,fn,1,⋯,fn,n−1,fn,n} 的生成函数,那么就有:
F
n
(
x
)
=
(
a
+
b
x
+
c
x
2
)
F
n
−
1
(
x
)
=
(
a
+
b
x
+
c
x
2
)
n
\begin{aligned} F_n(x)&=(a+bx+cx^2)F_{n-1}(x)\\ &=(a+bx+cx^2)^n \end{aligned}
Fn(x)=(a+bx+cx2)Fn−1(x)=(a+bx+cx2)n
苯为
这种给图上的点染颜色、要求边的端点颜色不同的题目,一定要确定好染色的顺序。比如说这一题,先把环上的颜色染完,那么剩下的树形结构就可以从上往下递推,每个点可染的颜色都是 k − 1 k-1 k−1。