4 条题解
-
0
贴一个非常抽象的线段树做法
首先我们注意到对于来说,能看见,需要满足对于任意的 所以我们直接对每一个开一颗线段树来维护前缀最大值,记,然后再开一颗来维护贡献(应该也可以合并到一颗上)。
这样的话初始贡献就很好求了,暴力建树即可。 然后考虑修改,发现修改对于后面的山是没有影响的,所以我们只考虑,的山和本身。
考虑的山,注意到每次的高度都是增加的,也就是都会变大,不会变小,这个时候我们就可以直接在线段树上二分,对于每个i找到第一个小于的前缀,然后分两种情况讨论:
第一种,如果这个点在之前,说明修改不会对看到后面的山造成影响,我们设修改前的和的斜率为,修改后的产生贡献当且仅当
1.之前没有产生过贡献,也就是
2.现在是前缀最大值了,也就是
然后修改一下前缀最大值就可以了,这种情况就完事了。
第二种,这个点在后面,说明有一坨,他们的都是小于的,这个时候他们的贡献清零,然后对于这个点后面的点,是不影响他们的贡献的,因为这个点后面的点都大于等于,不会被影响到。然后显然这个位置是有贡献的,修改一下就可以了。
接着考虑,直接暴力重构就可以了。
然后就做完了,复杂度是的,跑3s是没问题的。然后要注意下空间,实现精细一点,否则会爆(这就是为什么我赛时这个题爆蛋了),然后精度要注意一下。
代码十分构式,就不放了,大家想锻炼自己代码能力可以逝逝。
信息
- ID
- 524
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 16
- 已通过
- 6
- 上传者