Pro Tanto Quid R|

Schucking_Sattin

园龄:2年11个月粉丝:13关注:28

2023-02-24 21:33阅读: 19评论: 0推荐: 0

CF575B Bribes

CF575B Bribes

洛谷:CF575B Bribes

Codeforces:CF575B Bribes

Solution

对 “有效边” 统计被反向经过的数量然后等比数列求和。

考虑一条路径 st 对 "有效边 uv 是否有贡献。

  • uv 自叶向根:s 不在 u 子树内,tu 子树内。
  • uv 自根向叶:su 子树内,t 不在 u 子树内。

判断在不在子树内可以用 dfs 序。

对每一条 “有效边”,都需要求出给定序列中满足条件的 (s,t) 的数量。

考虑枚举 “有效边”,此时子树区间固定。

考虑将给定序列分成若干有向线段(线段端点位置是 dfs 序)。

具体地:若 dfnu<dfnv,自根向叶;否则自叶向根。

把正序线段称作一类线段,逆序线段称作二类线段,分别计算。

分类讨论哪些线段会对当前询问产生贡献:

  • 自叶向根:询问区间为 u 子树对应的区间,
    • 对于一类线段:左端点在区间左侧,右端点在区间内。
    • 对于二类线段:左端点在区间内,右端点在区间右侧。
  • 自根向叶:询问区间为 v 子树对应的区间,
    • 对于一类线段:左端点在区间内,右端点在区间右侧。
    • 对于二类线段:左端点在区间左侧,右端点在区间内。

需要预处理:

  • 以点 x 为左端点向右延伸的线段数量 lcx
  • 以点 x 为右端点向左延伸的线段数量 rcx
  • 对上面两个量求前缀和数组 lsumx,rsumx

左端点在区间左侧,右端点在区间内的线段数量可以转为 rsumrrsuml1cnt。其中 l,r 是区间端点,cnt 是完全被包含在区间内的线段数量,而 cnt 可以用二维数点求出来。

瓶颈在求 cnt,单 log

code CF575B Bribes

本文作者:Schucking-Sattin

本文链接:https://www.cnblogs.com/Schucking-Sattin/p/17153262.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Schucking_Sattin  阅读(19)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起