1 条题解

  • 0
    @ 2025-8-24 23:11:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar critnos
    咔菲好喝。

    搬运于2025-08-24 23:11:34,当前版本为作者最后更新于2025-05-07 12:52:44,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    感觉我的做法理论上是 2log?

    首先这个题意是,从 aab[l,r]b[l,r] 选两个可以空的子区间,最大化长度和乘上最小值。

    考虑 bib_i 作为最小值的极大区间,按这个极大区间和询问区间 [l,r][l,r] 的关系分类讨论。极大区间被 [l,r][l,r] 包含的情况可以预处理之后做二维数点。预处理考虑分类讨论一下 bib_iaa 中选的数的大小关系,bib_i 较大的情形可以用李超树处理。[l,r][l,r] 被极大区间包含的情况类似。

    相交也即 bb 中选的子区间是个 [l,r][l,r] 的前缀或者后缀,这里考虑后缀。bib_i 较小的情况还是简单的,考虑从 m1m\to 1 扫描线,一个被加入的 bib_i 的极大区间 [L,R][L,R] 的贡献是 (rL+1+ci)bi(r-L+1+c_i)b_icic_i 表示 bib_i 能取到的 aa 中的最长区间长度,要求 LlL\ge l 但不需要要求 LrL\le r,用树状数组套李超树即可,时间 O(nlog2n)O(n\log^2 n) 空间 O(nlogn)O(n\log n)

    对于 bib_i 较大的情况得去维护每个 aa 的答案,也就是对 aia_i 排序之后,设 lenilen_i 表示 aia_i 对应的极大区间长度,维护一个 mnimn_i 表示 aia_i 能取到的最小的 bb 中极大区间的左端点。还是从 m1m\to 1 扫描线,加入一个 [L,R][L,R] 的影响是 mnmn 的一段前缀取 min\min。一次询问相当于求 maxmnilai(rmni+1+leni)\max_{mn_i\ge l} a_i(r-mn_i+1+len_i)

    将取 min\min 变成 O(n)O(n) 次区间加,也就是维护 did_i 支持区间加,求后缀中 maxai(di+r)\max a_i(d_i+r)。这东西感觉 KTT 不太能维护。一个显然的做法是直接分块维护块内的凸包,O(nnlogn)O(n\sqrt {n\log n}) 或者 O(nn)O(n\sqrt n),我实现了这个,已经可以过了。但是!因为 aa 是有序的,我们维护的是 (ai,aidi)(a_i,a_id_i) 构成的凸包,给 did_i 加上某个值是不会改变凸包的。所以可以对 xx 轴建线段树,套持久化线段树/平衡树维护区间凸包应该就能 log2\log^2 了。

    • 1

    信息

    ID
    11753
    时间
    10000ms
    内存
    1024MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者