CF575B Bribes

CF575B Bribes

洛谷:CF575B Bribes

Codeforces:CF575B Bribes

Solution

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

考虑一条路径 \(s \to t\) 对 "有效边 \(u \to v\) 是否有贡献。

  • \(u \to v\) 自叶向根:\(s\) 不在 \(u\) 子树内,\(t\)\(u\) 子树内。
  • \(u \to v\) 自根向叶:\(s\)\(u\) 子树内,\(t\) 不在 \(u\) 子树内。

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

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

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

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

具体地:若 \(dfn_{u} < dfn_v\),自根向叶;否则自叶向根。

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

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

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

需要预处理:

  • 以点 \(x\) 为左端点向右延伸的线段数量 \(lc_x\)
  • 以点 \(x\) 为右端点向左延伸的线段数量 \(rc_x\)
  • 对上面两个量求前缀和数组 \(lsum_x, rsum_x\)

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

瓶颈在求 \(cnt\),单 \(\log\)

code CF575B Bribes

posted @ 2023-02-24 21:33  Schucking_Sattin  阅读(32)  评论(0)    收藏  举报