Loading

【题解】九省联考 2018 秘密袭击 coat

可以将危险程度转化为:枚举权值 \(t\in[1,W]\),如果某个连通块权值不小于 \(t\) 的节点个数不小于 \(k\) 个那么造成 \(1\) 的贡献。

考虑 dp:令 \(f_{u,i,j}\) 表示以 \(u\) 为根子树中包含 \(u\) 的连通块,有 \(j\) 个权值不小于 \(i\) 的节点的方案数。转移就是前两维枚举,第三维做背包。

不妨令 \(F_{u,i}(z)=\sum\limits_{j}z^jf_{u,i,j}\),最终要求的就是 \(\sum\limits_{j\geq k}[z^j]\sum\limits_{u,i}F_{u,i}(z)\),转移是 \(F_{u,i}(z)=z^{[d_u\geq i]}\prod\limits_{v\in son_u}F_{v,i}(z)\)考虑维护点值处理,需要维护的位置是一样的,只需要在外层 Newton 插值,内层的转移反而会方便很多。此时在外层枚举 \(t\),里面需要维护的就是 \(F_{u,i}(t)\),转移就是子树对位乘然后考虑一下 \(u\) 本身带来的一个前缀乘。最后求出 \(\sum\limits_{u,i}F_{u,i}(t)\) 后暴力 \(O(n^2)\) 插系数即可。

接着就是考虑内层怎么做这个对位相乘。注意到 \(F_{u,i}(t)\) 会被分成若干段,事实上,段数和叶子个数相关。考虑启发式合并,具体实现可以考虑线段树合并,在每个结点处维护权值相等的标记即可。

又是一个转化为维护点值的套路题 >_< 。

代码:评测记录 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @ 2021-09-26 20:44  Qiuly  阅读(71)  评论(0编辑  收藏  举报