[省选] [线段树] [差分数组] [BZOJ1558] [JSOI2009] 等差数列

题目传送门。
因为一道脑洞题写的这个…
等差数列公差相等,果断维护差分数组,但是差分数组会比原数组少一个元素,这里需要注意。
这里维护 d i = a i − a i − 1       i ∈ [ 2 , n ] d_i=a_i-a_{i-1}\ \ \ \ \ i\in [2,n] di=aiai1     i[2,n] i ∈ N i\in \mathbb{N} iN
修改相当于两个点修改和一个段修改。对于 [ l , r ] [l,r] [l,r]的修改,需要的修改为:
d l − > d l + a d_l->d_l+a dl>dl+a d r + 1 − > d r + 1 − ( a + b ∗ ( r − l ) ) d_{r+1}->d_{r+1}-(a+b*(r-l)) dr+1>dr+1(a+b(rl)) d i − > d i + b      i ∈ [ l + 1 , r ] d_i->d_i+b\ \ \ \ i\in [l+1,r] di>di+b    i[l+1,r]
那么如何获得答案?
请允许我说之前写的都很……嗯……扯淡……
具体问题是:两个数也可以构成等差数列,所以两个相邻不同颜色可以合并以减少答案……或者第一个数自己就可以构成一个长度为 2 2 2的等差数列……
看了FallDream的博客后才明白一些……
用一个二进制数 a r a l ( 2 ) a_ra_{l_{(2)}} aral(2)表示一个区间 [ l , r ] [l,r] [l,r]的左右端点选择或不选择合并到上一层答案的状态。如果某一端没有被选,则它是由下一层的中间合并的,才使它没被选(变成了一个单独的数),因此如果有两个区间需要合并,那么左区间的右端和右区间的左端不能同时不选。
然后,按情况合并即可……注意如果左区间右端和右区间左端同时被选且两端数相同,则应减去 1 1 1
答案应该使得左右端点都包含……
时间复杂度 O ( ( n + Q ) log ⁡ 2 n ) O((n+Q)\log_2 n) O((n+Q)log2n)
Code

你可能感兴趣的:(线段树,差分数组,省选)