1 条题解

  • 0
    @ 2022-11-17 9:56:17

    测试点 1 :

    O(nq)O(nq)暴力。

    测试点 2~6 :

    容易看出这是一个分段函数,形如:

    $$F(x) = \begin{cases} A, & \text {x$\leq$ L}\\ x+T, & \text {L<x<R}\\ B, & \text {x $\geq$ R} \end{cases} $$

    我们只需要通过二分找到这个分段函数的三个断点,就可以在O(1)O(1)的时间回答每一个询问了。

    测试点 7~11:

    最多只有1010个取min,maxmin,max的位置,那么直接维护11操作对应区间内的和,对于每一次询问,分段算答案即可,树状数组可以解决这个问题。

    测试点12~16:

    可以直接DDPDDP来处理取minmin操作,就变成DDPDDP模板题了:

    对于只有取minmin操作的询问,我们可以构造一个如下的矩阵乘法操作:

    Ci,j=mink(ai,k+bk,j)C_{i,j}=\min_{k}(a_{i,k}+b_{k,j})

    对于一个当前的数字xxvvminmin,我们只需要构造矩阵

    $$\begin{bmatrix} 0 & \inf \\ v & 0 \\ \end{bmatrix} $$

    即可。

    对于一个当前的数字xxvv,我们只需要构造矩阵

    $$\begin{bmatrix} v & \inf \\ \inf & 0 \\ \end{bmatrix} $$

    即可。

    那么对于一次询问F(x)F(x),就相当于是让矩阵[x,0][x,0]依次乘以这些矩阵,由于上述矩阵的乘法依旧满足结合律,我们用线段树维护这些矩阵的乘积即可。

    除此之外这个部分分还有一个单纯用线段树维护后续起作用的minmin操作的位置的做法,大致结论是:对于任意一个位置开始向后,最多只有一个位置的取minmin操作生效了,我们维护那个唯一生效的取minmin位置即可,但这是某个验题人的做法,出题人并不清楚细节,所以不展开描述。

    测试点1~20:我们知道这是一个分段函数,那么就可以直接在线段树上来维护它了。

    参考测试点2~ 6,我们知道把任意一段区间[L,R][L,R]的操作按顺序考虑,它都是一个形如测试点2~6题解所示的分段函数,如果我们知道区间[L,mid][L,mid]对应的分段函数,以及区间[mid+1,R][mid+1,R]对应的分段函数,那么我们可以在O(3+3)O(3+3)的时间内求出区间[L,R][L,R]所对应的分段函数,那么我们就可以直接用线段树来维护这个分段函数,在O(logn)O(logn)的时间里完成一个修改操作的更新,在O(1)O(1)的时间里回答一次询问。

    这个做法最难写的部分是合并两个分段函数,出题人的写法相对比较通用,直接用双指针来扫描两个分段函数的值域, 然后动态的合并它,常数比分类讨论略大。

    • 1

    信息

    ID
    1662
    时间
    2000ms
    内存
    512MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者