1 条题解

  • 0
    @ 2025-10-28 12:08:44

    题意回顾

    • 有向图,nn 个点,每个点至少一条出边
    • 初始只有 AA 点为黑色,其余白色
    • 游戏过程:
      • Alice 选一个编号 k\leq k 的黑点 uu
      • Bob 从 uu 的出边中选一个点染黑
    • 定义 (A,B)(A,B) 是好的:如果从 AA 开始,Alice 能强制BB 被染黑(无论 Bob 怎么选)
    • 对每个 k=1..nk=1..n,求好的 (A,B)(A,B) 对数量(ABA \neq B

    数据范围:n2×105n \leq 2\times 10^5l5×105\sum l \leq 5\times 10^5


    关键结论

    (A,B)(A,B) 是好的当且仅当在只保留编号 k\leq k 的点的子图 GkG_k 中:

    1. 存在 AABB 的路径
    2. BB 所在的强连通分量(SCC)是 GkG_k 的一个汇点(即在 GkG_k 的 SCC 分解中,该 SCC 没有出边指向其他 SCC)

    算法框架

    1. 增量处理

    k=1k=1nn 依次处理,每次加入点 kk 及其相关边。

    2. 维护 SCC

    使用并查集(DSU)维护当前 GkG_k 的强连通分量。

    3. 动态维护汇点 SCC

    对每个 SCC 维护:

    • 大小 sizesize
    • 出边集合(指向其他 SCC)
    • 标记是否为汇点

    4. 统计答案

    对每个汇点 SCC,设能到达它的点数为 RR,则它贡献 (R1)×size(R - 1) \times size 个好对。


    算法步骤

    初始化

    • ans[k]=0ans[k] = 0
    • DSU 初始化,每个点单独成 SCC
    • 每个 SCC 的 outdeg=0outdeg = 0(出边到其他 SCC 的数量)
    • reachable[SCC]=reachable[SCC] = 该 SCC 的大小

    处理 k=1k=1nn

    1. 加入点 kk
    2. kk 的每条出边 (k,v)(k,v)
      • 如果 vkv \leq k,在 DAG 中添加边 (SCC(k),SCC(v))(SCC(k), SCC(v))
      • 如果 SCC(k)SCC(v)SCC(k) \neq SCC(v),则增加 SCC(k)SCC(k) 的出度
    3. 检查并合并形成环的 SCC
    4. 更新汇点 SCC 集合
    5. 对每个汇点 SCC 计算 RR = 能到达它的点数
    6. $ans[k] = \sum_{S \in \text{sinks}} (R_S - 1) \times size_S$

    复杂度分析

    • 使用路径压缩 + 按秩合并的 DSU:O(mα(n))O(m \alpha(n))
    • 动态维护 SCC 出度和可达性:O(mlogn)O(m \log n)
    • 总复杂度:O((n+m)logn)O((n+m) \log n),可过 n2×105n \leq 2\times 10^5

    总结

    本题的核心在于将博弈条件转化为图论中的汇点 SCC 可达性问题,通过增量加点和动态维护 SCC 来高效求解所有 kk 的答案。

    • 1

    信息

    ID
    4468
    时间
    5000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者