题目大意
要求维护由
n
个点
n,Q<=105
分析
这题有不少的解法,但基本的都是把折线拆成若干个独立的梯形的答案之和。
通过维护面积的解法
我们用线段树来暴力维护 fa 表示直线 x=a 以下折线下方的面积。对于一个梯形的小段我们分成一个矩形和一个三角形,矩形的部分可以将 [0,h0) 这部分区间加一,而 [h0,h1) 部分是一个等差数列,我们只需要维护一个支持区间加上一个数、区间加上一个等差数列,以及单点查询的线段树就可以了。
维护式子的解法
考虑两种情况:梯形完全在直线之下、梯形露出了个尖角,三角形不完全在直线上。
对于第一种情况直接减去整个梯形的面积即可。
对于第二种情况,直接计算对答案的贡献,暴力展开二次函数维护系数。
需要统计有哪些完全在直线以下,哪些完全在直线以上。
维护二次函数的解法
在上一种解法中提到了二次函数。我们发现即便完全在直线以下、或者完全在直线以上,也不过是一次函数或者常量。那么我们写出分段函数,用树状数组维护 fa 表示询问 x=a 时的二次函数的系数。比较方便好写。