一棵以 1 为根的树,每个点 u 有一对权值 (au,bu)au1 的概率为 pu,为 0 的概率为 1pu。确定 au 后,计算 buaubvvu 的子节点)的众数(保证子节点个数为偶数个,即参与计算众数的点数为奇数)。求 b11 的概率。Q 次更改某个点 upu,修改间不独立。(N<=2e5,Q<=5e4)

某些人一看到多次修改就上重链部分、动态 DP。思维僵化了。

一般的动态 DP 所用的矩阵显然常数过大,还不容易维护。

应当注意到动态维护 DP 值的困难性,考虑离线。离线后可以对每个点建立时间轴,存储每个时间段分别是什么值。

考虑转移到 u,记参与众数计算的有 degu 个。发现要合并一堆时间轴。观察:

  1. 这时很可能出现一个段数多一堆段数少的情况,直接分治合并就错了。
  2. 合并的中间结果不应是“每个时间段的多项式”。

也就是说,应该是递归到一段区间,一部分时间轴在该区间内概率不变。可以想到线段树合并,但是是多个线段树合并。

一部分时间轴在该区间内概率不变,即这些时间轴在该区间是叶子。我们的策略是,挑出叶子,合并信息,递归下传,直至非叶子不超过一个。这个过程维护一个多项式信息。

非叶子不超过一个时,合并答案,某时间点是 1 的概率从 p 变为 p 乘上有 (degu1)/21 的概率,加上至少有 (degu1)/2+11 的概率。线段树上维护 mul,add 标记。

一个细节是维护的多项式信息次数不能太高,最多不超过当前非叶子个数,因为太低次数的不可能对答案有贡献。低次数的系数抹为 0 再整体平移。这时为了算前缀和,必须最开始就乘上一个 (1+x+x2+x3+)

O(Nlog2N+Qlog3Q)。前者是乘 N 个一次多项式,后者是线段树合并。

skip2004 的 std。https://qoj.ac/submission/413331

posted on   Zaunese  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?



点击右上角即可分享
微信分享提示