线段树区间gcd和区间最大绝对值差
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/949/H
来源:牛客网
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
备注:
前置知识:差分数组、线段树
差分数组
设原数组为 , 令 , 称 为 的差分数组。
差分数组有什么好处呢?
首先不难得到
另外,对原数组 进行区间加 的操作时只需要令:
,。这样做的目的是为了让我们每次查询 的时候都能保证 的结果都是比原来多 的,从而实现了区间加法操作。
线段树是一种能够支持 复杂度进行区间查询,区间修改的数据结构。
题目是经典区间修改及查询问题,需要特定的数据结构进行求解。仔细观察每一个操作,不难发现:
- 操作1能够用上述差分数组的区间加操作完成,转换成线段树的单点修改。
- 操作2查询的差分数组区间的最大绝对值,转换为线段树的区间最大值查询,需要维护一个绝对值最大的值。
- 操作3中,因为 值可以通过线段树维护,由定理 得到启发,我们在查询的时候可以转化为 , 是差分数组 在区间的。
于是通过对差分数组建立线段树,维护线段树上的 三个值,就能解决这道题。
注意线段树上查询区间 时间复杂度是 , 本题保证 , 可视为常数
总体时间复杂度
标签:gcd,贝壳,线段,差分,数组,区间,操作 来源: https://www.cnblogs.com/lipu123/p/14318031.html