1 条题解

  • 0
    @ 2025-8-24 23:09:50

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar xiezheyuan
    明明我已昼夜无间踏尽前路/梦想中的彼岸为何还未到/明明我已奋力无间/天天上路/我不死也为活更好/快要到终点才能知道/又再回到起点重头上路

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

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

    以下是正文


    简要题意

    注意这里的题意使用的字母相比于原题意的字母略有改动,本题解中以这里的字母为准。

    给定两个长度为 nn 的序列 d,ld,l。若第 i1i-1 个时刻权值为 xi1x_{i-1},则 ximin(xi1+di,li)x_i\gets\min(x_{i-1}+d_i,l_i)。有 mm 次操作,支持:

    • 0 p v 表示 lpvl_p\gets v
    • 1 L R k 对于全体 c[L,R]c\in[L,R],令 xc1lc1x_{c-1}\gets l_{c-1},从第 cc 个时刻开始到第 RR 个时刻,求出最终的 xRx_R 的第 kk 大值。
    • 2 L R x0 对于全体 c[L,R]c\in[L,R],令 xc1x0x_{c-1}\gets x_0,从第 cc 个时刻开始到第 RR 个时刻,求出最终的 xRx_R 的最大值。
    • 3 L R 对于全体 c[L,R]c\in[L,R],令 xc1lc1x_{c-1}\gets l_{c-1},从第 cc 个时刻开始到第 RR 个时刻,求出最终 xRx_R 的种类数。

    $1\leq n\leq 10^5,1\leq m\leq 2\times 10^5,0\leq d_i\leq 10^4,0\leq l_i\leq 10^9$。

    思路

    DS trick 多合一,不可多得的练习题。

    Part 1

    先来考虑如何快速求出对于一个 cc,从第 cc 个时刻开始,最终的 xRx_R。这并不困难,直接给出式子:

    $$\min\left(x_{c-1}+\sum_{k=c}^{R} d_k, \min_{k=c+1}^{R+1}l_{k-1}+\sum_{i=k}^{R}d_i\right) $$

    大致就是要么没有受到上界的性质,要么枚举最后受到上界限制的点 k1k-1。由于所有可能情况都可以取到,我们每次更新 xix_i 只会选择最小的方案,所以需要取 min\min

    于是预处理 dd 的前缀和,然后记一个 Fk=lk1+i=kndiF_k=l_{k-1}+\sum_{i=k}^{n}d_i 的 RMQ(由于带修改,所以需要动态化,可以用线段树之类的),就可以做到单次询问 O(nlogn)O(n\log n) 了。

    Part 2

    考虑如何快速做第一种询问。我们发现 xc1lc1x_{c-1}\gets l_{c-1},所以对于每一个 cc,结合 Part 1,xRx_R 其实就是 FF 在区间 [c,R+1][c,R+1] 的最小值减去 dd 的一个后缀和(这是常量)。

    由于最小值单调不增,所以对于 c<cc<c',后者求出的 xRx_R 更大。于是第 kk 大其实就是在 c=Rk+1c=R-k+1 处取到,于是转换为单点修改区间最大值问题,用普通的线段树即可解决。时间复杂度单次 O(logn)O(\log n)

    Part 3

    现在的任务是第二种询问,此时 xc1x_{c-1} 不再是 lc1l_{c-1},但是求第 kk 大改为了求最大值。这需要我们再次观察式子:

    $$\min\left(x_{c-1}+\sum_{k=c}^{R} d_k, \min_{k=c+1}^{R+1}l_{k-1}+\sum_{i=k}^{R}d_i\right) $$

    观察到 min\min 的第一个参数,f(c)=x0+k=cRdkf(c)=x_0+\sum_{k=c}^{R}d_k 关于 cc 不增,第二个参数 g(c)=mink=c+1R+1FkΔg(c)=\min_{k=c+1}^{R+1} F_k-\Delta(其中 Δ=k=R+1ndk\Delta=\sum_{k=R+1}^{n}d_k 为常量)关于 cc 不降。

    对于两个单调的且增减性不同的函数的最小值求最大值,一般用二分,找到它们的交点,则答案在交点取到(当然,如果没有整交点,则在交点两侧取到)。特别地,如果没有交点,则在某一个边界取到。

    时间复杂度 O(log2n)O(\log^2 n)(一个 log\log 在二分,另一个 log\log 在求函数 g(c)g(c) 的值)。

    Part 4

    最后需要解决的是第三种询问,我们需要求出种类数,xc1lc1x_{c-1}\gets l_{c-1}。由于 xc1x_{c-1} 与第一种询问相同,所以可以沿用处理第一种询问时得到的结论:对于每一个 ccxRx_RFF 在区间 [c,R+1][c,R+1] 的最小值减去 dd 的一个后缀和。

    于是我们需要单点修改 FF 上的一个位置,查询某一个区间的后缀最小值的种类数。参考 P4198 楼房重建,使用兔队线段树完成即可。具体可以参考兔队的博客

    时间复杂度单次 O(log2n)O(\log^2 n)

    故总时间复杂度 O(nlogμn+mlog2n)O(n\log^\mu n+m\log^2 n) 可以通过本题(其中 μ\mu 视实现可能为 1122)。

    Submission

    • 1

    信息

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