序列分治

算法

通过类似于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) (RL+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个区间,然后分别求解,利用容斥可以算出答案。

posted @ 2021-01-18 16:55  dinlon  阅读(197)  评论(0)    收藏  举报