P4099 [HEOI2013] SAO

原题

今天我刚知道一个很逆天的事:DAG 的拓扑序方案数不可做!!!,目前能做到的最优方法好像是状压

我们考虑这题怎么做,对于一个限制,我们关心的是他俩在拓扑序中的相对排名,而这题恰好是一个树形结构,因此我们考虑树形 dp

我们设 dpi,j 表示以 i 为根的子树, i 在拓扑序中的排名为 j 的方案数

我们现在对于已经合并过的以 u 为根的子树,我们考虑把一个没有合并上去的以 v 为根的子树合并上去。显然有两种情况

  1. 先算 u 后算 v
    此时我们考虑合并前 u 的排名为 p1v 的排名为 p2 ,合并后 u 的排名为 p3 ,我们可以发现关系: p11p31p11+p21 ,因为 u 必须在 v 的前面。化简后变为: p1p3p1+p21
    我们可以列出 dp 式子: dpu,p3+=dpu,p1×dpv,p2×(p31p11)×(sizu+sizvp3sizup1)
    其中 (p31p11) 表示前 p31 中一定有 p11 在里面; (sizu+sizvp3sizup1) 则表示在 u 点后面的部分中 sizup1 一定在里面

  2. 先算 v 后算 u
    1. 的计算方式,直接给出结论: p1+p2p3sizu+sizv
    dp 的递推式为: dpu,p3+=dpu,p1×dpv,p2×(p31p11)×(sizu+sizvp3sizup1)

我们暴力 dp 的复杂度是 O(n3)


我们考虑优化,我们发现我们的 dp 式子中 dpv,p2 好像重复出现了很多次,因此我们可以前缀和优化

最终复杂度 O(n2)

p.s. 听说 NTT 可以优化到 O(nlogn) ,神奇

posted @   FOX_konata  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示