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)\).
总结
考试的时候想到了枚举最小值,但没有想到容斥,还是对容斥的理解不够透彻,不能很快地想到容斥.
考试的时候也观察到了每个点是个分段的一次函数的性质,但由于对多项式不够敏感,且没有第一步暴力容斥的基础,没能想到使用拉格朗日插值.
代码
代码在洛谷上被卡常了,就不放了.
标签:P8290,省选,多项式,容斥,一次函数,最小值,端点,联考 From: https://www.cnblogs.com/yanchengzhi/p/17002031.html