P8290 [省选联考 2022] 填树

https://www.luogu.com.cn/problem/P8290

题解

\(P(l,r)\)表示最小值为\(l\)(至少\(1\)个),其它数在\([l,r]\)的第一问的答案,\(Q(l,r)\)表示最小值为\(l\)(至少\(1\)个),其它数在\([l,r]\)的第二问的答案.发现有强制选的限制,不是很好求,因此可以考虑容斥.

\(p(l,r)\),\(q(l,r)\)分别表示数字在\([l,r]\)任意取且没有限制的答案.

那么\(P(l,r)=p(l,r)-p(l+1,r)\),\(Q(l,r)=q(l,r)-q(l+1,r)\).

下面考虑如何\(O(n)\)\(p(l,r)\).

\(w_u\)表示\(u\)的可能取值的数量,\(f_u\)表示以\(u\)为链的端点,\(u\)的子树中的所有链的方案数,\(sumf_u=\sum_{u \to v}f_v\).

再考虑如何\(O(n)\)\(q(l,r)\).

\(s_u\)表示\(u\)的可能的取值的和,\(g_u\)表示以\(u\)为链的端点,\(u\)的子树中的所有链的长度和,\(sumg_u=\sum_{u \to v}g_v\).

这里只给出状态的设计,转移的时候分\(3\)类讨论即可:1.单点\(u\).2.以\(u\)为端点的链.3.经过\(u\)的链.

且这些情况都必须在\(u\)的子树内讨论,这样一定可以做到不重不漏地包含所有的链.

最后答案就是枚举最小值,\(i\),计算所有的\(P(i,i+k)\)\(Q(i,i+k)\).

\(P(i,i+k)\)的本质是\(n\)个一次函数/常函数相乘,最多是\(n\)次多项式,\(Q(i,i+k)\)的本质是\(n-1\)个一次函数/常函数和\(1\)个二次函数相乘,最多是\(n+1\)次多项式.

因此,它们的前缀分别是\(n+1\)次多项式和\(n+2\)次多项式.

对于每一段,暴力求出\(n+2\)\(n+3\)个点值再使用拉格朗日插值即可,这样的段数为\(O(4n)\).

总结

考试的时候想到了枚举最小值,但没有想到容斥,还是对容斥的理解不够透彻,不能很快地想到容斥.

考试的时候也观察到了每个点是个分段的一次函数的性质,但由于对多项式不够敏感,且没有第一步暴力容斥的基础,没能想到使用拉格朗日插值.

代码

代码在洛谷上被卡常了,就不放了.

posted @ 2022-12-24 09:22  top_tree  阅读(93)  评论(0)    收藏  举报