起初有这么一个想法:枚举路径权值最小值,权值上界不就确定了?
于是,用一个小小小容斥确保最小值等于某个值
l
l
l ,第一问的答案简单表示为
∑
l
(
p
(
l
,
l
+
K
)
−
p
(
l
+
1
,
l
+
K
)
)
sum_{l}Big( p(l,l+K)-p(l+1,l+K) Big)
l∑(p(l,l+K)−p(l+1,l+K))
其中 p ( l , r ) p(l,r) p(l,r) 表示路径上每个点权值必须在 [ l , r ] [l,r] [l,r] 以内的方案数(第一问答案),类似地,我们可以定义 q ( l , r ) q(l,r) q(l,r) 表示第二问答案。
当我们确定 l , r l,r l,r 后,每个点权的可选区间就可以独立地确定,于是就变成了一个裸的经典的树形DP题,在 l c a lca lca 处算入每条路径的贡献,可以 O ( n ) O(n) O(n) 解决。没什么好说的,代码也很简单。
但是呢,它的值域很恼人,太大了。这时我的想法是,值域可以分成 O ( n ) O(n) O(n) 个不交的区间,这些区间内部的性质都是一样的。具体地,每个区间 [ L , R ] [L,R] [L,R] 需要满足的条件是,当 l l l 从 L L L 增加到 R R R 时, l l l、 l + 1 l+1 l+1 和 l + K l+K l+K 不会跨过任何一个 l i l_i li 和 r i r_i ri 。
这时,每个点权要么在
[
R
+
1
,
L
+
K
−
1
]
[R+1,L+K-1]
[R+1,L+K−1] 之间,要么在
[
L
,
R
]
[L,R]
[L,R] 和
[
L
+
K
,
R
+
K
]
[L+K,R+K]
[L+K,R+K] 这两个边缘区间中,我们发现在边缘区间中的点地位同等,于是有价值的是点权处在两个边缘区间中的点分别的个数。我们令
f
[
i
]
[
j
]
f[i][j]
f[i][j] 表示有
i
i
i 个点权处在
[
L
,
R
]
[L,R]
[L,R] 中,有
j
j
j 个点权处在
[
L
+
K
,
R
+
K
]
[L+K,R+K]
[L+K,R+K] 中的方案数(不考虑在边缘区间中的具体位置),那么以第一问为例,总的贡献就是
∑
x
=
L
R
(
∑
i
+
j
≤
n
f
[
i
]
[
j
]
(
R
−
x
+
1
)
i
(
x
−
L
+
1
)
j
)
=
∑
x
=
L
R
f
(
x
)
sum_{x=L}^{R}left(sum_{i+jleq n}f[i][j](R-x+1)^i(x-L+1)^jright)=sum_{x=L}^R f(x)
x=L∑R(i+j≤n∑f[i][j](R−x+1)i(x−L+1)j)=x=L∑Rf(x)
好怪哦,但是式子本身不重要,你只需要知道 f ( x ) f(x) f(x) 是关于 x x x 的 O ( n ) O(n) O(n) 次多项式函数就够了!
那么 F ( x ) = ∑ x ′ = L x f ( x ′ ) = ∑ x ′ = L x ( ∑ i + j ≤ n f [ i ] [ j ] ( R − x ′ + 1 ) i ( x ′ − L + 1 ) j ) F(x)=sum_{x'=L}^x f(x')=sum_{x'=L}^x left(sum_{i+jleq n}f[i][j](R-x'+1)^i(x'-L+1)^jright) F(x)=∑x′=Lxf(x′)=∑x′=Lx(∑i+j≤nf[i][j](R−x′+1)i(x′−L+1)j) 也是关于 x x x 的多项式函数,而我们要求的是 F ( R ) F(R) F(R) 。
直接求多项式是 O ( n 4 ∼ n 5 ) O(n^4sim n^5) O(n4∼n5) 的,但是求 f ( x ) f(x) f(x) 的某个点值是 O ( n ) O(n) O(n) 的!(因为 f ( x ) = p ( x , x + K ) − p ( x + 1 , x + K ) f(x)=p(x,x+K)-p(x+1,x+K) f(x)=p(x,x+K)−p(x+1,x+K))
所以我们可以求出 f ( L ) , f ( L + 1 ) , . . . , f ( L + n ) f(L),f(L+1),...,f(L+n) f(L),f(L+1),...,f(L+n) ,对它们求前缀和得到 F ( L ) , F ( L + 1 ) , . . . , F ( L + n ) F(L),F(L+1),...,F(L+n) F(L),F(L+1),...,F(L+n) ,然后拉格朗日插值法求出 F ( R ) F(R) F(R) 。
对第二问也是类似的。总时间复杂度 O ( n 3 ) O(n^3) O(n3) 。
CODE#include#include



