1 条题解

  • 0
    @ 2025-10-31 15:32:16

    题意简化

    • 敌人 DDxx 轴上方
    • 发射源 SS 和激光塔 TTxx 轴下方
    • 选两个激光塔 Ti,TjT_i, T_j 连成线段(能量墙)
    • 选一个发射源 SkS_k 和一个敌人 DlD_l 连成线段(攻击射线)
    • 要求两条线段相交
    • 保证无重点、无三点共线

    关键几何性质

    由于 SkS_kxx 轴下方,DlD_lxx 轴上方,线段 SkDlS_kD_l 必然穿过 xx 轴。

    两条线段相交的充要条件是:

    • TiT_iTjT_j 在直线 SkDlS_kD_l 的两侧
    • SkS_kDlD_l 在直线 TiTjT_iT_j 的两侧

    但我们可以简化:
    对于固定的 (Sk,Dl)(S_k, D_l),直线 L=SkDlL = S_kD_l 将平面分成两个半平面。
    TiT_iTjT_j 必须在 LL 的两侧,它们的连线才可能与 SkDlS_kD_l 相交(另一条件自动满足,因为 SkS_kDlD_l 分别在 xx 轴两侧,而 TiTjT_iT_jxx 轴下方,要相交必须分隔它们)。


    优化思路

    直接枚举四元组 O(T2SD)O(T^2 \cdot S \cdot D) 不可行。

    优化:固定 (Sk,Dl)(S_k, D_l),计算激光塔在直线 SkDlS_kD_l 两侧的数量 AABB,则这对 (Sk,Dl)(S_k, D_l) 的贡献是 A×BA \times B

    这样复杂度为 O(SDT)O(S \cdot D \cdot T),最坏 80035×108800^3 \approx 5\times 10^8,但实际运行常数小,可以接受。


    算法步骤

    1. 读入 DD 个敌人坐标
    2. 读入 SS 个发射源坐标
    3. 读入 TT 个激光塔坐标
    4. 初始化答案 ans=0ans = 0
    5. 对每个发射源 SkS_k 和每个敌人 DlD_l
      • 统计激光塔在直线 SkDlS_kD_l 两侧的数量 cnt+cnt_{+}cntcnt_{-}
      • ans +=cnt+×cntans \ += cnt_{+} \times cnt_{-}
    6. 输出 ansans

    复杂度分析

    • 时间复杂度O(SDT)O(S \cdot D \cdot T)
    • 空间复杂度O(S+D+T)O(S + D + T)

    对于 D,S,T800D,S,T \le 800,最坏 8003=5.12×108800^3 = 5.12\times 10^8 次运算,在 C++ 中经过编译器优化后可以在几秒内通过。

    • 1

    信息

    ID
    4847
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者