题意
给定一棵 n n n 个结点的树,共有 q q q 次询问。
第
i
i
i 次询问首先包含了三个数
k
i
,
m
i
,
r
i
k_i,m_i,r_i
ki,mi,ri ,接着给定了树上互不相同的
k
i
k_i
ki 个关键点
a
i
,
1
,
a
i
,
2
,
…
,
a
i
,
k
a_{i, 1}, a_{i, 2}, \dots, a_{i, k}
ai,1,ai,2,…,ai,k 。对于第
i
i
i次询问,你需要回答当这棵树以
r
i
r_i
ri 为根时,你有多少种方案将这
k
i
k_i
ki 个点分为至多
m
i
m_i
mi 组,使得同一组内的任意两个不同的结点都不存在祖先关系。
对于第 i i i 次询问,假设你一共将 k i k_i ki 个点分成了 p p p 组,那么分组的方案需要满足:
- 给出的 k i k_i ki 个点中每个点属于且仅属于 p p p 组中的其中一组。
- p p p 组中的任意一组都要至少包含一个结点。
对于第
i
i
i 次询问,两个分组的方案不同,当且仅当它们分出的组数不同,或者存在两个点
a
i
,
x
,
a
i
,
y
(
x
≠
y
)
a_{i, x}, a_{i, y}(x \neq y)
ai,x,ai,y(x=y) ,它
们在其中一种分组方案中被分到了同一组,在另一种分组方案中没有被分到同一组。
数据范围:
对于 20% 的数据,
n
≤
10
,
∑
k
i
≤
20
,
m
i
≤
min
(
4
,
k
i
)
n \leq 10, \sum k_{i} \leq 20, m_{i} \leq \min \left(4, k_{i}\right)
n≤10,∑ki≤20,mi≤min(4,ki) ;
对于 60% 的数据, n ≤ 1 0 4 , ∑ k i ≤ 1 0 4 , m i ≤ min ( 50 , k i ) n \leq 10^{4}, \sum k_{i} \leq 10^{4}, m_{i} \leq \min \left(50, k_{i}\right) n≤104,∑ki≤104,mi≤min(50,ki) ;
对于另外 20% 的数据,保证第 i i i 条边是 ( 1 , i + 1 ) (1,i+1) (1,i+1) ,并且对于每个询问 r i = 1 r_i=1 ri=1;
对于 100% 的数据, n ≤ 1 0 5 , q ≤ 1 0 5 , ∑ k i ≤ 1 0 5 , 1 ≤ u , v ≤ n n \leq 10^{5}, q \leq 10^{5}, \sum k_{i} \leq 10^{5}, 1 \leq u, v \leq n n≤105,q≤105,∑ki≤105,1≤u,v≤n 。
对于每个询问, 1 ≤ k i , r i ≤ n , 1 ≤ m i ≤ min ( 300 , k i ) 1 \leq k_{i}, r_{i} \leq n, 1 \leq m_{i} \leq \min \left(300, k_{i}\right) 1≤ki,ri≤n,1≤mi≤min(300,ki)。
题解
考场:
只会直观的DP,记
f
[
i
]
[
j
]
f[i][j]
f[i][j]为
i
i
i子树内分成
j
j
j组的方案数,转移时枚举、容斥一下,但效率是
O
(
n
×
m
2
)
O(n\times m^{2})
O(n×m2)的,就算用虚树优化也过不了,于是只拿了60的暴力。
正解:
若直接在树上做,难以避免枚举子树分成几组,转移时效率不优秀。
故考虑能否每次只加入一个点。发现若按照一定顺序一个个加入点,记
f
[
i
]
[
j
]
f[i][j]
f[i][j]为前
i
i
i个分为
j
j
j组,则每次转移为
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
−
1
]
+
f
[
i
]
[
j
−
1
]
×
x
f[i][j]=f[i-1][j-1]+f[i][j-1]\times x
f[i][j]=f[i−1][j−1]+f[i][j−1]×x,十分优秀。考虑
x
x
x怎么算,对于不能有祖先关系,只考虑后代不能放到祖先的集合,即每个点加入时,不能放到有它的祖先的集合,而此时它的祖先已全都加入,且一定在不同集合内,于是直接减去祖先个数即可。而对于加入点的顺序,考虑若在一颗树上,则按照深度顺序,那么对于一个根和一些关键点,即为它到根的路径上关键点的个数,整个过程用树状数组维护即可。