1 条题解

  • 0
    @ 2025-8-24 22:16:14

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar happy_zero
    坐标 FJ || 初二菜鸡

    搬运于2025-08-24 22:16:14,当前版本为作者最后更新于2025-02-10 17:56:45,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    线段树部分参考:「题解」PA2019 Terytoria

    首先需要发现,横纵坐标互不干扰,最终的答案其实就是横坐标的答案乘纵坐标的答案。

    以横坐标为例。问题转化成了对于每个 (x0,x1)(x_0,x_1) 选择覆盖 S=[x0,x1)S=[x_0,x_1)T=[1,x0)(x1,n]T=[1,x_0)\cup(x_1,n]

    但其实如果直接做考虑每个选择哪一个是很困难的,观察到两种情况区间是不交的,于是有两种办法:

    扫描线+线段树

    发现若已经确定了 aa 在最终答案中,是可以直接推出每组 (x0,x1)(x_0,x_1) 到底覆盖什么的。

    当然不能直接枚举 xx,首先要把 xx 的个数降下来:将所有 x0/1x_{0/1} 离散化成 xx',则 (xi1,xi](x'_{i-1},x'_i] 内的所有 xx 是等价的,因为并没有端点在这个区间内,相当于是处在一个“空隙”中。

    xx 的个数降到了 O(n)O(n) 级别,接着考虑当 xx 右移的情况下,每个点的覆盖情况会发生怎样的变化:

    • x=1x=1 时,所有点覆盖的都是 TT
    • xx+1x\to x+1 时:
      • 此时 x0=xx_0=x 的点原先取 SS 已经无法覆盖 x+1x+1 了,于是变成覆盖 TT
      • 此时 x1=xx_1=x 的点原先取 TT 也已经无法覆盖 x+1x+1 了,变成覆盖 SS
      • 由于 S,TS,T 中一共就三“段”, STS\Leftrightarrow T 最多只会进行 2 次,因此只有上面两种情况。

    按上面的步骤,复杂度均摊仍是线性的。同时,我们需要一个数据结构(最简单的是线段树)来维护被覆盖个数最多的点的覆盖个数及数量,对应区间加、全局 max\maxmax\max 个数。

    复杂度 O(nlogn)O(n\log n),但常数很大,注意

    • 线段树用节点 ll 代表 hshlhshl1hsh_l-hsh_{l-1},这样可以只离散化 x0,x1x_0,x_1
    • 若同时进行多次区间加,则可以将其合并一些,比如 [1,a],(b,n][1,a],(b,n]1-1(a,b](a,b]11 可合并为全局加 11(a,b](a,b]22,常数可减小一半。

    哈希

    当确定了所有区间覆盖 SS 还是 TT 时是容易的,我们不可能暴力枚举,但可以将 SSTT 放到一起做。

    难点在于保证 SSTT 不能同时取。由于其是不交的,运用哈希的套路,为每一个 SSTT 都随机一个权值,若选了 AA,则将 AA 中的所有点的 ww 异或上 AA 的权值。

    定义一种覆盖方案的 WW 为所有点的 ww 的异或和,大概率下,不同的方案下对应的是不同的 WW,且由 ST=US\cup T=U 可以知道,每个点都被 nn 个区间覆盖,那么每一种 WW 下对应的都是一种合法的方案。

    于是直接统计出 WW 的最大出现次数即是答案。

    事实证明,哈希不一定要写异或哈希,和哈希等其实也是可以的。注意,若写异或哈希,生成的随机数得是 64 位的,否则出错概率会比较大,会 WA on #1。


    code

    • 1

    信息

    ID
    4994
    时间
    1000~3000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者