ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-23 16:34:34  阅读:427  来源: 互联网

标签: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

备注:

 

 

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

差分数组

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

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

 

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

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

  • 操作1能够用上述差分数组的区间加操作完成,转换成线段树的单点修改。
  • 操作2查询的差分数组区间的最大绝对值,转换为线段树的区间最大值查询,需要维护一个绝对值最大的值。
  • 操作3中,因为 值可以通过线段树维护,由定理 得到启发,我们在查询的时候可以转化为  是差分数组  在区间

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

 

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有