zoukankan      html  css  js  c++  java
  • 题解【LOJ3340】「NOI2020」命运

    题面

    一个性质:

    对于一个点对 ((u,v)),其中 (u)(v) 的祖先,如果 ((u,v)) 满足题目中的限制条件,那么对于每一个 (u) 的祖先 (w),点对 ((w,v)) 一定也满足限制条件。

    根据这个性质,我们可以进行 DP:设 (f_{u,i}) 表示下端点在 (u) 的子树中、不满足限制条件的上端点最大的深度为 (i) 的方案数,其中 (f_{u,0}) 表示所有限制条件都被满足。

    转移考虑 (u) 的子节点 (v),边 ((u,v)) 填的是 (0/1)

    1. (1)(f_{u,i}=sumlimits_{j=0}^{dep_u}f_{u,i}f_{v,j})
    2. (0):假设 (f_{u,i})(f_{v,j}) 转移过来,那么一定有 (ige j)(证明可以通过开头的),所以 (f_{u,i}=sumlimits_{j=0}^i f_{u,i}f_{v,j}+sumlimits_{j=0}^{i-1}f_{u,j}f_{v,i}),其中后面一项上界是 (i-1) 的原因是避免 (f_{u,i}f_{v,i}) 算两次。

    考虑进一步优化。设 (g_{u,i}=sumlimits_{j=0}^i f_{u,j}),整理一下转移式子:

    [egin{aligned} f_{u,i} &=f_{u,i}g_{v,dep_u}+f_{u,i}g_{v,i}+f_{v,i}g_{u,i-1}\ &=f_{u,i}(g_{v,dep_u}+g_{v,i})+f_{v,i}g_{u,i-1} end{aligned} ]

    然后考虑整体 DP,用线段树维护 DP 值。发现 (g_{v,dep_u}) 与下标无关,可以直接先算出来。维护 (g_{v,i})(g_{u,i-1}) 即可,区间乘法可以打标记维护。

    具体实现细节参考 代码

  • 相关阅读:
    序列化
    python_模块与包
    python_常用内置模块
    python_生成器
    python_文件操作
    你好,mysql
    2017年12月20日 内置对象
    2017年12月17日 ASP.NET 12个表单元素&&简单控件/复合控件
    2017年12月16日 ASP.NET基本用法
    2017年12月14日 LinQ高级查&&Asp.net WebForm Asp.net MVC
  • 原文地址:https://www.cnblogs.com/xsl19/p/14578927.html
Copyright © 2011-2022 走看看