序列分治
算法
通过类似于cdq分治的思路,每一次在分治过程中只处理跨越中间mid的区间,然后递归处理两边。
可以用来求解序列上一些最优性问题和计数问题。比如求解求解区间权值 =value∗length的问题,但是还有一些题目也可以求解。比如求区间max,min,gcd等有关的题目。
题目
P5502 [JSOI2015]最大公约数
求解
(
R
−
L
+
1
)
×
g
c
d
(
A
l
,
.
.
.
,
A
r
)
(R−L+1)×gcd(Al,...,Ar)
(R−L+1)×gcd(Al,...,Ar)的最大值,序列上分治,然后每一次维护两个指针,从mid开始移动,然后根据贪心我们如果加入了一个数gcd不变,那么就加入。然后我们分别选取两边优先加入,这样就包含了所有情况。???
相当于取到了从ai到amid的所有gcd然后贪心使得长度达到最大。
另外分块可以做到 O ( n n + n l o g 2 n ) O(n\sqrt{n}+nlog^2n) O(nn+nlog2n)
T83234 1014 区间max(max)
类似的求解(r-l+1)*min(ai)的最大值,同样是序列上分治,然后双指针进行处理,从mid开始移动,然后看哪一边值更大就向哪边走。其实可以直接单调栈处理即可。
序列问题
同样的求解所有区间的最大最小值乘积之和,那么我们用序列分治,每次从mid移动指针然后将最大最小值取得位置进行标记,然后就将右边区间分为三段,分别计算即可,因为min直降,max只会上升,所以指针只用移动一次即可。
P6406 [COCI2014-2015#2] Norma
与之前那个考试题唯一的区别就在于,这个问题要求还要乘上区间长度,不过还是同样的思路,划分为3个区间,然后分别求解,利用容斥可以算出答案。

浙公网安备 33010602011771号