1 条题解

  • 0
    @ 2025-8-24 23:05:18

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zhenjianuo2025
    Still we'd fight until our last

    搬运于2025-08-24 23:05:18,当前版本为作者最后更新于2024-09-26 09:13:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    (y,x)(y,x) 的点视作 [x,y][x,y] 的区间,现在问题转化为维护区间集合 SS,支持:

    • 动态修改 SS 中的某个元素;
    • 查询 SS 内被给定区间 [l,r][l,r] 包含的区间中最短的区间。

    对于一次询问操作 [l,r][l,r]

    • 找到 x0lx_0\ge l 的最小的 y0y_0
    • 求出 y0yry_0\le y\le r 的最小的 yxy-x 的值。

    可以证明这是正确的:

    • 一方面,对于任何合法的区间 [x,y][x,y],因为 yy0y\ge y_0,必定会被计入答案之中。
    • 另一方面,考虑一个 y0yry_0\le y\le rx<lx<l 的不合法区间 [x,y][x,y],由于 yx>y0ly0x0y-x>y_0-l\ge y_0-x_0,所以必定不会对答案造成任何影响。

    上面两项都可以使用线段树简单维护。用 std::mutiset 辅助存储每个左端点对应的右端点集,以及每个右端点对应的左端点集。修改时单点修改两棵线段树上的对应位置。时间复杂度 Θ((n+q)logn)\Theta\left((n+q)\log n\right),可以通过。

    其他任何想法欢迎与我私信交流。

    • 1

    信息

    ID
    10569
    时间
    2000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者