P9755 解题报告
前言
什么一眼题。
为什么我第一眼还能不会
思路分析
首先注意到函数里有个对
看一眼数据范围发现
对于
这个天数显然是非常有影响的,因为如果天数多了对
考虑二分出天数
处理出这个之后我们就可以进行 check。
考虑一个非常暴力的做法,按照
直接树剖+线段树维护可以做到
但其实直接按这个天数排序对于点暴力往上跳打标记也是对的,可以做到单
接着回到上面那个问题怎么处理出
首先我们有了树每天生长的一个高度的函数图,然后可以进行分讨。
- 对于
c_i=0 的情况,那个函数就是一条直线,直接算出d_i 即可。 - 对于
c_i>0 的情况,那个函数是一条上升的直线,考虑计算d_i 到x 的函数和x 轴围成的面积,不难发现这就是一个梯形,可以二分也可以直接算。 - 对于
c_i<0 的情况,函数就是一条下降的直线最后再拼上一条y=1 的直线,计算上考虑先把图形分割了,前面还是梯形,后面还是一个矩形,可以先把矩形直接剥掉然后套用2 计算。
然后讲下具体的实现问题。
目前的所有题解好像都用到了 __int128 和两次二分,实际上上面那个部分的实现可以做到不用二分,而且也不用 int128。
笔者比较菜所以只是没用 int128,但是优化还是非常显著的,三只
具体的,我们发现实在计算时梯形面积是
也就是我们可以考虑,直接计算
注意不能直接用
但是我们可以粗略的估计出会不会爆
此时的误差最多只有
代码
给两份,第一个树剖实现,
link。
第二个正常实现,
link.