链接: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(a,b) == gcd(a,b-a),那么我们把原数组差分一下,这样区间修改就只用修改两个点了,求相邻两点的差值也是一样的,线段树上多维护个mx[]就好了 实现代码:
#include<bits/stdc++.h>
using namespace std; #define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid ll m = (l + r) >> 1
const ll M = 2e5+;
ll a[M],b[M],c[M],sum[M<<],mx[M<<],n;
ll lowbit(ll x)
{
return x & -x;
}
void add(ll x,ll val){
for(ll i = x;i <= M;i += lowbit(i)){
c[i] += val;
}
} ll getsum(ll x){
ll ans = ;
for(ll i = x;i > ;i -= lowbit(i)){
ans += c[i];
}
return ans;
} void up(ll rt){
sum[rt] = __gcd(sum[rt<<] ,sum[rt<<|]);
mx[rt] = max(abs(mx[rt<<]),abs(mx[rt<<|]));
} void build(ll l,ll r,ll rt){
if(l == r){
sum[rt] = b[l];
mx[rt] = b[l];
return ;
}
mid;
build(lson); build(rson);
up(rt);
} void update(ll p,ll c,ll l,ll r,ll rt){
if(l == r){
sum[rt] += c;
mx[rt] += c;
return ;
}
mid;
if(p <= m) update(p,c,lson);
else update(p,c,rson);
up(rt);
} ll query_gcd(ll L,ll R,ll l,ll r,ll rt){
if(L <= l&&R >= r){
return sum[rt];
}
mid;
ll ret = ;
if(L <= m) ret = __gcd(ret,query_gcd(L,R,lson));
if(R > m) ret = __gcd(ret,query_gcd(L,R,rson));
return abs(ret);
} ll query_max(ll L,ll R,ll l,ll r,ll rt){
if(L <= l&&R >= r){
return mx[rt];
}
mid;
ll ret = ;
if(L <= m) ret = max(ret,abs(query_max(L,R,lson)));
if(R > m) ret = max(ret,abs(query_max(L,R,rson)));
return ret;
} int main()
{
ll m,l,r,x;
scanf("%lld%lld",&n,&m);
for(ll i = ;i <= n;i ++) scanf("%lld",&a[i]),b[i]=a[i]-a[i-];
build(,n,);
ll op;
for(ll i = ;i <= m;i ++){
scanf("%lld",&op);
if(op == ){
scanf("%lld%lld%lld",&l,&r,&x);
update(l,x,,n,);
if(r < n) update(r+,-x,,n,);
add(l,x); add(r+,-x);
}
else if(op == ){
scanf("%lld%lld",&l,&r);
ll ans;
if(l!=r)
ans = query_max(l+,r,,n,);
else
ans = ;
printf("%lld\n",ans);
}
else {
scanf("%lld%lld",&l,&r);
ll cnt = a[l] + getsum(l);
if(l != r){
ll ans = query_gcd(l+,r,,n,);
printf("%lld\n",__gcd(cnt,ans));
}
else {
printf("%lld\n",cnt);
}
}
}
return ;
}
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    链接:https://ac.nowcoder.com/acm/contest/949/F来源:牛客网 时间限制: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. 002_linuxC++_.h和.c文件

    (一)程序修改001_linuxC++之_类的引入 (二)修改成为.h和.c文件 #include <stdio.h> #include "person.h" int ...

  2. MySQL 8.0.15 配置 MGR单主多从

    转载自:http://www.cnblogs.com/zhangzihong/p/10443526.html 一.简介 MySQL Group Replication(简称MGR)字面意思是mysql ...

  3. win10下安装docker

    win10下安装docker 1. 启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定(整个过程需要重新启动几次),如图: 安装Doc ...

  4. 8月清北学堂培训 Day3

    今天是赵和旭老师的讲授~ 状态压缩 dp 状态压缩是设计 dp 状态的一种方式. 当普通的 dp 状态维数很多(或者说维数与输入数据有关),但每一维总量很少时,可以将多维状态压缩为一维来记录. 这种题 ...

  5. Django基础之form表单的补充进阶

    1. 应用Bootstrap样式 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  6. 第二章 c语言概述

    一.#include指令和头文件 1.#include C预处理指令,C编译器在编译前对源代码做一些准备工作 2.stdio.h标准输入输出头文件,提供了关于输入输出的信息供编译器使用 头文件包含了建 ...

  7. DBCA创建数据库

    工具/原料 oracle database 11g 步骤/方法 1 确保安装好oracle database 11g 2 打开命令提示符(运行中输入CMD打开 或是在 附件中点击打开) 3 输入dbc ...

  8. 3.1 Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. 一.Go语言中的指针 Go语言中的函数传参都是值 ...

  9. 分颜色通道SR的相关论文

    1.SRCNN-译文.doc https://max.book118.com/html/2017/0628/118607667.shtm 见SRCNN翻译:彩色通道的实验 - wangxujin666 ...

  10. Class.ForName()读取配置文件

    榨汁机(Juicer)榨汁的案例 分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze) public class Demo_Reflect { /* ...