4 条题解

  • 0
    @ 2025-10-29 10:10:48

    贴一个非常抽象的线段树做法

    首先我们注意到对于ii来说,能看见jj,需要满足对于任意的Slope(i,j)>=Slope(i,k),k(i,j)Slope(i,j)>=Slope(i,k),k∈(i,j) 所以我们直接对每一个ii开一颗线段树来维护前缀最大值,记premax(i,x)=max(Slope(i,s))s(i,x]pre_{max}(i,x)=max(Slope(i,s)),s∈(i,x],然后再开一颗来维护贡献(应该也可以合并到一颗上)。

    这样的话初始贡献就很好求了,暴力建树即可。 然后考虑修改xx,发现修改xx对于xx后面的山是没有影响的,所以我们只考虑,i<xi<x的山和xx本身。

    考虑i<xi<x的山,注意到每次xx的高度都是增加的,也就是Slope(i,x)Slope(i,x)都会变大,不会变小,这个时候我们就可以直接在线段树上二分,对于每个i找到第一个小于Slope(i,x)Slope(i,x)的前缀,然后分两种情况讨论:

    第一种,如果这个点在xx之前,说明修改xx不会对ii看到xx后面的山造成影响,我们设修改前的iixx的斜率为Slope(i,x)Slope'(i,x),修改后的xx产生贡献当且仅当

    1.之前没有产生过贡献,也就是Slope(i,x)<premax(i,x)Slope'(i,x)<pre_{max}'(i,x)

    2.现在是前缀最大值了,也就是premax(i,x)<=Slope(i,x)pre_{max}'(i,x)<=Slope(i,x)

    然后修改一下前缀最大值就可以了,这种情况就完事了。

    第二种,这个点在xx后面,说明有一坨jj,他们的Slope(i,j)Slope(i,j)都是小于Slope(i,x)Slope(i,x)的,这个时候他们的贡献清零,然后对于这个点后面的点,是不影响他们的贡献的,因为这个点后面的点premaxpre_{max}都大于等于Slope(i,x)Slope(i,x),不会被影响到。然后显然xx这个位置是有贡献的,修改一下就可以了。

    接着考虑xx,直接暴力重构就可以了。

    然后就做完了,复杂度是O(n(n+q)logn)O(n(n+q)logn)的,跑3s是没问题的。然后要注意下空间,实现精细一点,否则会爆(这就是为什么我赛时这个题爆蛋了),然后精度要注意一下。

    代码十分构式,就不放了,大家想锻炼自己代码能力可以逝逝。

    • @ 2025-10-29 10:48:29

      %%%思路清晰代码短

信息

ID
524
时间
3000ms
内存
512MiB
难度
8
标签
(无)
递交数
16
已通过
6
上传者