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

题目描述

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

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

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

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

输入描述:

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

输出描述:

共 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≤n,m≤105,1≤coli,x≤103,1≤opt≤3,1≤l≤r≤n

解题思路:自己没写出来,看了题解感觉很有道理。根据gcd的性质有gcd(a,b)=gcd(a,b-a),有gcd(a,b,c)=gcd(a,b-a,c-b),可以联想到在线段树中建立一个差分数组,用线段树来维护区间和与区间gcd ,对于操作一直接进行单点更新l和r+1即可,对于操作二,我们可以用线段树维护差分数组的差的最大值和最小值,比较一下它们绝对值大小取绝对值大的那就就可以了,对于操作三,可以先查找出前l项的和即为第l个数的值,然后再和区间[l+1,r]上的gcd再求一下gcd就可以了。

代码:
//gcd(x,y,z)=gcd(x,y-x,z-y)=gcd(a,gcd(y-x,z-y))
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
int n,m,a[maxn*],Sum[maxn*],Min[maxn*],Max[maxn*],Gcd[maxn*];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
void pushup(int rt){
Sum[rt]=Sum[rt<<]+Sum[rt<<|];
Min[rt]=min(Min[rt<<],Min[rt<<|]);
Max[rt]=max(Max[rt<<],Max[rt<<|]);
Gcd[rt]=gcd(Gcd[rt<<],Gcd[rt<<|]);
}
void build(int l,int r,int rt){
if(l==r){
Sum[rt]=Min[rt]=Max[rt]=Gcd[rt]=a[l]-a[l-];
return;
}
int mid=l+r>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
pushup(rt);
}
void update(int pos,int val,int l,int r,int rt){
if(l==r){
Sum[rt]+=val;
Min[rt]+=val;
Max[rt]+=val;
Gcd[rt]+=val;
return;
}
int mid=l+r>>;
if(mid>=pos) update(pos,val,l,mid,rt<<);
if(mid<pos) update(pos,val,mid+,r,rt<<|);
pushup(rt);
}
int query_sum(int L,int R,int l,int r,int rt){
if(L>R) return ;
if(L<=l&&R>=r){
return Sum[rt];
}
int mid=l+r>>,res=;
if(mid>=L) res+=query_sum(L,R,l,mid,rt<<);
if(mid<R) res+=query_sum(L,R,mid+,r,rt<<|);
return res;
}
int query_min(int L,int R,int l,int r,int rt){
if(L>R) return ;
if(L<=l&&R>=r){
return Min[rt];
}
int mid=l+r>>,res=2e9+;
if(mid>=L) res=min(res,query_min(L,R,l,mid,rt<<));
if(mid<R) res=min(res,query_min(L,R,mid+,r,rt<<|));
return res;
}
int query_max(int L,int R,int l,int r,int rt){
if(L>R) return ;
if(L<=l&&R>=r){
return Max[rt];
}
int mid=l+r>>,res=-(2e9+);
if(mid>=L) res=max(res,query_max(L,R,l,mid,rt<<));
if(mid<R) res=max(res,query_max(L,R,mid+,r,rt<<|));
return res;
}
int query_gcd(int L,int R,int l,int r,int rt){
if(L>R) return ;
if(L<=l&&R>=r){
return Gcd[rt];
}
int mid=l+r>>,res=;
if(mid>=L) res=gcd(res,query_gcd(L,R,l,mid,rt<<));
if(mid<R) res=gcd(res,query_gcd(L,R,mid+,r,rt<<|));
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,n,);
while(m--){
int op,l,r,val;
scanf("%d%d%d",&op,&l,&r);
if(op==){
scanf("%d",&val);
update(l,val,,n,);
if(r<n) update(r+,-val,,n,);
}else if(op==){
printf("%d\n",max(-query_min(l+,r,,n,),query_max(l+,r,,n,)));
}else{
printf("%d\n",abs(gcd(query_sum(,l,,n,),query_gcd(l+,r,,n,))));
}
}
return ;
}

牛客小白月赛16 H小阳的贝壳 (线段树+差分数组)的更多相关文章

  1. 牛客小白月赛16 H 小阳的贝壳 (差分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/949/H来源:牛客网 题目描述 小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colico ...

  2. 牛客小白月赛16 小石的妹子 二分 or 线段树

    牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...

  3. 牛客小白月赛16 D 小阳买水果 (思维题)

    链接:https://ac.nowcoder.com/acm/contest/949/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  4. 牛客小白月赛16 F 小石的妹子 (线段树)

    链接:https://ac.nowcoder.com/acm/contest/949/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  5. 牛客小白月赛2 H 武 【Dijkstra】

    链接:https://www.nowcoder.com/acm/contest/86/H来源:牛客网 题目描述 其次,Sεlιнα(Selina) 要进行体力比武竞赛. 在 Sεlιнα 所在的城市, ...

  6. 牛客网 牛客小白月赛1 H.写真がとどいています

    H.写真がとどいています   链接:https://www.nowcoder.com/acm/contest/85/H来源:牛客网     这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就 ...

  7. 牛客小白月赛16 A 小石的签到题 ( 博弈)

    链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 牛客小白月赛4 H 相邻的糖果 思维

    链接:https://www.nowcoder.com/acm/contest/134/H来源:牛客网 题目描述 有n个盒子摆成一排,每个盒子内都有ai个糖果. 现在你可以执行以下操作: ·你可以选择 ...

  9. 牛客小白月赛12 H 华华和月月种树 (离线dfs序+线段树)

    链接:https://ac.nowcoder.com/acm/contest/392/H 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...

随机推荐

  1. Ubuntu下批量使用Tecplot的preplot命令对数据进行处理

    首先把.PLT文件后缀批量修改为.dat rename 's/.PLT$/.dat/' *.PLT 对所有.dat文件批量执行preplot find ./ -name "*.dat&quo ...

  2. springboot+thymeleaf 访问静态资源解决(static)

    ---------------------------------------2.1.3-------------------------------------------------------- ...

  3. 第三代DRDS分布式SQL引擎全新发布

    DRDS (阿里云分布式关系型数据库服务,https://www.aliyun.com/product/drds)于 4 月 30 号发布了 5.3 版本,这是一个年度大更新.主要带来了以下特性: 性 ...

  4. Django2 + ORM

    创建模型类class UserInfo(models.Model): id = models.IntegerField() username = models.CharField(max_length ...

  5. 编辑器直接word直接上传word里的图片

    tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. http ...

  6. POJ 1797 Heavy Transprotation ( 最短路变形 || 最小生成树 )

    题意 : 找出 1 到 N 点的所有路径当中拥有最大承载量的一条路,输出这个最大承载量!而每一条路的最大承载量由拥有最大承载量的那一条边决定 分析 : 与 POJ 2253 相似且求的东西正好相反,属 ...

  7. eclipse中maven工程添加本地库至Maven Dependencies

    1.WEB-INF文件夹下添加lib文件夹,文件夹下添加demo-client-0.1-SNAPSHOT.jar 2.pom.xml中配置如下代码: <dependency> <gr ...

  8. 麦子lavarel---16、日志

    麦子lavarel---16.日志 一.总结 一句话总结: 一定要养成打印日志查看日志的好习惯,非常节约时间和便于查错 1.console.Log(“获取类别数据:"):console.Lo ...

  9. sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

    排错: 看到 Duplicate entry '1' for key 'PRIMARY'是主键错误 看一看自己添加的数据id是1 再查询一下数据库中的表,发现id=1的记录已经存在了 所以在代码中让i ...

  10. mysql.connector.errors.ProgrammingError: 1698 (28000): Access denied for user 'root'@'localhost'

    排错,首先在sql编辑工具 通过测试连接,查看一下自己的密码是否正确 : 由此可见,是自己的密码错误,输入正确的密码后 在这里把密码修改为正确之后程序运行正常 #初始化数据库连接 engine = c ...