Loading

【题解】Ynoi 2008 stcm

考虑菊花图怎么做:对所有儿子节点进行分治,然后可以发现每个点最多被暴力加 \(\log\) 次。

考虑原问题,模仿之前的做法,考虑对每个点的所有儿子,带权进行分治(哈夫曼树结构),然后就会获得 54 pts 的好成绩。

这个做法有什么问题?考虑建哈夫曼树时,这些儿子节点中的某一个:如果其和另外的节点首次合并,那么权值和没有至少乘 \(2\)(因为另外的那个点权值不会比该儿子节点大);如果不是首次合并,那么权值和一定至少乘 \(2\)

因此可以考虑构造一组数据:上面是由一些点组成的链,在链的每个点上挂一个点,然后在链的最底下挂上一个超大子树,那么在链上往上做的时候,超大子树每次都需要暴力做,算法劣化至暴力级别。

注意到可能出现上述情况的只有可能是重儿子,有没有办法处理呢?考虑对于每条重链暴力做,计算重链上点的贡献,只需要暴力加入轻子树(显然每个点最多被暴力加 \(\log\) 次)。然后再对链上节点挂着的轻子树跑上面的分治即可。

此时对于轻儿子中权值最大的那个,在做完后权值也一定会翻倍,复杂度得到了保障。

代码:记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),好像跑的挺快。

posted @ 2021-09-14 15:37  Qiuly  阅读(74)  评论(0编辑  收藏  举报