其他分享
首页 > 其他分享> > 线段树区间gcd和区间最大绝对值差

线段树区间gcd和区间最大绝对值差

作者:互联网

链接:https://ac.nowcoder.com/acm/contest/949/H
来源:牛客网

小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 col 。现在小阳有 3 种操作:

1 l r x:给 [l,r] 区间里所有贝壳的颜色值加上 x 。

2 l r:询问 [l,r] 区间里所有相邻贝壳 颜色值的差(取绝对值) 的最大值(若 l=r 输出 0)。

3 l r :询问 [l,r]区间里所有贝壳颜色值的最大公约数。

输入描述:

第一行输入两个正整数 n,m,分别表示贝壳个数和操作个数。
第二行输入 n 个数 col​,表示每个贝壳的初始颜色。
第三到第 m+2 行,每行第一个数为 opt,表示操作编号。接下来的输入的变量与操作编号对应。

输出描述:

共 m 行,对于每个询问(操作 2 和操作 3)输出对应的结果。
示例1

输入

复制
5 6
2 2 3 3 3
1 2 3 3
2 2 4
3 3 5
1 1 4 2
3 2 3
2 3 5

输出

复制
3
3
1
3

备注:

 

 

前置知识:差分数组、线段树

差分数组

设原数组为 , 令 , 称  为  的差分数组。
差分数组有什么好处呢?
首先不难得到 
另外,对原数组  进行区间加  的操作时只需要令:

。这样做的目的是为了让我们每次查询  的时候都能保证  的结果都是比原来多  的,从而实现了区间加法操作。

 

线段树是一种能够支持  复杂度进行区间查询,区间修改的数据结构。
图片说明

题目是经典区间修改及查询问题,需要特定的数据结构进行求解。仔细观察每一个操作,不难发现:

于是通过对差分数组建立线段树,维护线段树上的  三个值,就能解决这道题。
注意线段树上查询区间  时间复杂度是 , 本题保证 , 可视为常数
总体时间复杂度 

 

标签:gcd,贝壳,线段,差分,数组,区间,操作
来源: https://www.cnblogs.com/lipu123/p/14318031.html