1 条题解

  • 0
    @ 2025-12-11 1:36:10

    题解:炸弹连锁引爆计数

    问题转化

    每个炸弹 ii 可以引爆坐标在 [XiRi,Xi+Ri][X_i - R_i, X_i + R_i] 内的所有炸弹。
    初始引爆 ii 后,所有被直接或间接引爆的炸弹都会爆炸,要求对每个 ii 求出引爆的炸弹总数,然后计算:

    $$\sum_{i=1}^N (i \times \text{cnt}_i) \bmod (10^9+7) $$

    其中 cnti\text{cnt}_i 是炸弹 ii 能引爆的总炸弹数。

    关键观察

    1. 引爆的传递性

    如果炸弹 ii 能引爆 jjjj 能引爆 kk,那么 ii 也能引爆 kk
    因此,引爆关系构成一个有向图(ii 向所有在 [XiRi,Xi+Ri][X_i - R_i, X_i + R_i] 内的 jj 连边),需要求每个点能到达的点数。

    2. 区间合并

    由于坐标递增,引爆区间 [Li,Ri]=[XiRi,Xi+Ri][L_i, R_i] = [X_i - R_i, X_i + R_i] 可能不是单调的,但传递引爆相当于:

    • ii 出发,能引爆的炸弹形成一个连续区间 [lefti,righti][left_i, right_i](按坐标排序后的编号区间)。
    • 证明:若 ii 能引爆 jjkkj<kj < k),且坐标在 jjkk 之间的炸弹 tt 必然在 [XjRj,Xk+Rk][X_j - R_j, X_k + R_k] 的覆盖范围内,通过连锁反应也会被引爆。

    因此问题变为:对每个 ii,求最小的 ll 和最大的 rr,使得从 ii 出发能覆盖到 llrr 的所有炸弹。

    3. 递推关系

    leftileft_i 为从 ii 出发能引爆的最左边炸弹编号,rightiright_i 为最右边编号。
    初始:lefti=min{jXjXiRi}left_i = \min\{j \mid X_j \ge X_i - R_i\}righti=max{jXjXi+Ri}right_i = \max\{j \mid X_j \le X_i + R_i\}

    但实际引爆还会扩展:
    如果 ii 能引爆 jj,那么 ii 的引爆区间会扩展到 [leftj,rightj][left_j, right_j]
    因此需要迭代扩展:

    lefti=minj[lefti,righti]leftjleft_i = \min_{j \in [left_i, right_i]} left_j righti=maxj[lefti,righti]rightjright_i = \max_{j \in [left_i, right_i]} right_j

    4. 优化扩展过程

    这是一个区间最值扩展问题,可以用单调栈+倍增优化。

    定义:

    • L[i][k]L[i][k]:从 ii 出发,扩展 2k2^k 步后能到达的最左编号
    • R[i][k]R[i][k]:从 ii 出发,扩展 2k2^k 步后能到达的最右编号

    初始:

    L[i][0] = \text{lower_bound}(X_i - R_i) R[i][0] = \text{upper_bound}(X_i + R_i) - 1

    递推:

    $$L[i][k] = \min_{j \in [L[i][k-1], R[i][k-1]]} L[j][k-1] $$$$R[i][k] = \max_{j \in [L[i][k-1], R[i][k-1]]} R[j][k-1] $$

    5. 快速求区间最值

    由于 NN 可达 5×1055\times 10^5,需要 O(logN)O(\log N) 查询区间最值。
    用 ST 表预处理 LLRR 的区间最小值/最大值。

    minST[l][r]minST[l][r]L[i][0]L[i][0] 在区间 [l,r][l, r] 的最小值,maxST[l][r]maxST[l][r] 类似。

    那么:

    $$L[i][k] = \min_{j \in [L[i][k-1], R[i][k-1]]} L[j][k-1] $$

    可以用 ST 表 O(1)O(1) 查询。

    6. 算法步骤

    1. 读入 NN(Xi,Ri)(X_i, R_i),坐标严格递增。
    2. 预处理 ST 表,用于查询任意区间 [l,r][l, r]L[i][0]L[i][0] 最小值和 R[i][0]R[i][0] 最大值。
    3. 初始化 L[i][0]L[i][0]R[i][0]R[i][0]
      • L[i][0]=L[i][0] = 最小的 jj 满足 XjXiRiX_j \ge X_i - R_i(二分查找)
      • R[i][0]=R[i][0] = 最大的 jj 满足 XjXi+RiX_j \le X_i + R_i(二分查找)
    4. 倍增迭代 K=log2NK = \lceil \log_2 N \rceil 次:
      • 对于 k=1k = 1KK
        • 对于每个 ii,用 ST 表查询 [L[i][k1],R[i][k1]][L[i][k-1], R[i][k-1]]LL 最小值作为 L[i][k]L[i][k]
        • 用 ST 表查询 [L[i][k1],R[i][k1]][L[i][k-1], R[i][k-1]]RR 最大值作为 R[i][k]R[i][k]
    5. 计算最终 leftileft_irightiright_i
      • 初始 l=il = ir=ir = i
      • k=Kk = K 向下到 00
        • llrr 查询区间 [l,r][l, r]LL 最小值 ll'RR 最大值 rr'
        • 如果 l<ll' < lr>rr' > r,则更新 l=ll = l'r=rr = r',并继续
    6. 最终引爆数 cnti=rl+1cnt_i = r - l + 1
    7. 计算答案:$$\text{ans} = \sum_{i=1}^N (i \times cnt_i) \bmod (10^9+7) $$

    7. 复杂度分析

    • 预处理 ST 表:O(NlogN)O(N \log N)
    • 二分查找初始区间:O(NlogN)O(N \log N)
    • 倍增迭代:O(NlogN)O(N \log N)
    • 总复杂度:O(NlogN)O(N \log N)
    • 空间复杂度:O(NlogN)O(N \log N)

    8. 注意事项

    • 坐标和半径很大,用 long long 存储
    • ST 表查询区间最值时注意边界
    • 最终答案取模 109+710^9+7
    • 1

    信息

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