题目传送门。
因为一道脑洞题写的这个…
等差数列公差相等,果断维护差分数组,但是差分数组会比原数组少一个元素,这里需要注意。
这里维护
d
i
=
a
i
−
a
i
−
1
i
∈
[
2
,
n
]
d_i=a_i-a_{i-1}\ \ \ \ \ i\in [2,n]
di=ai−ai−1 i∈[2,n] 且
i
∈
N
i\in \mathbb{N}
i∈N
修改相当于两个点修改和一个段修改。对于
[
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∗(r−l)),
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
[省选] [线段树] [差分数组] [BZOJ1558] [JSOI2009] 等差数列
最新推荐文章于 2024-08-11 19:13:39 发布