题目描述

给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一:

“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。

“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。

输入

第一行两个整数N,M,第二行N个整数Ai,接下来M行每条指令的格式如题目描述所示。

输出

对于每个询问,输出一个整数表示答案。

样例输入

5 5

1 3 5 7 9

Q 1 5

C 1 5 1

Q 1 5

C 3 3 6

Q 2 4

样例输出

1

2

4

提示

N,M≤2*10^5 l<=r,数据保证任何时刻序列中的数都是不超过2^62-1的正整数。

题解

gcd(x,y)=gcd(x,y-x),gcd(x,y,z)=gcd(x,y-x,z-y)……对任意多个整数都成立 然后用线段树维护这个差分序列,更新gcd。再用树状数组来维护原序列x的值。细节注意

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define L(u) (u<<1)
#define R(u) (u<<1|1)
const int maxn=5e5+10;
ll c[maxn];
int n,m;
template<class T>
void read(T &res) {
res = 0;
char c = getchar();
T f = 1;
while(c < '0' || c > '9')
{
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {
putchar('-');
x = -x;
}
if(x >= 10)
{
out(x / 10);
}
putchar('0' + x % 10);
}
struct Node{
int l,r;
ll val;
}node[maxn<<2];
int lowbit(int x)
{
return x&-x;
}
void add(int x,ll val)
{
for (int i=x;i<=n;i+=lowbit(i))
c[i]+=val;
}
ll get_sum(int x)
{
ll ret=0;
for (int i=x;i>=1;i-=lowbit(i))
ret+=c[i];
return ret;
}
ll s[maxn],a[maxn];
void push_up(int u){//
node[u].val=__gcd(node[L(u)].val,node[R(u)].val);
}
void build(int u,int l,int r){
node[u].l=l,node[u].r=r;
if(l==r){
node[u].val=s[l];
return;
}
int mid=(l+r)>>1;
build(L(u),l,mid);
build(R(u),mid+1,r);
push_up(u); }
ll query(int u,int l,int r){
if(l<=node[u].l&&node[u].r<=r){
return node[u].val;
}
int mid=(node[u].l+node[u].r)>>1;
if(r<=mid) return query(L(u),l,r);
else if(l>mid) return query(R(u),l,r);
else return __gcd(query(L(u),l,mid),query(R(u),mid+1,r)); }
void update(int u,int x,ll val){
if(node[u].l==node[u].r){
node[u].val+=val;
return;
}
int mid=(node[u].l+node[u].r)>>1;
if(x<=mid) update(L(u),x,val);
else update(R(u),x,val);
push_up(u);
}
int main(){
read(n);
read(m);
for (int i = 1; i <=n ; ++i) {
read(a[i]);
s[i]=a[i]-a[i-1];
add(i,s[i]);
}
char str;int l,r;
ll d;
build(1,1,n);
for(int i=1;i<=m;++i) {
scanf(" %c", &str);
if (str == 'C') {
read(l);
read(r);
read(d);
add(l, d);
add(r + 1, -d);
update(1, l, d);
if (r + 1 <= n)update(1, r + 1, -d);
} else {
read(l);read(r);
ll ans = abs(__gcd(get_sum(l), query(1, l+1, r)));
out(ans);
puts("");
}
}
}

【线段树】Interval GCD的更多相关文章

  1. D - 小Z的加油店 线段树+差分+GCD

    D - 小Z的加油店 HYSBZ - 5028   这个题目是一个线段树+差分+GCD 推荐一个差分的博客:https://www.cnblogs.com/cjoierljl/p/8728110.ht ...

  2. Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD

    题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...

  3. 线段树 Interval Tree

    一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...

  4. Codeforces.914D.Bash and a Tough Math Puzzle(线段树)

    题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...

  5. Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)

    大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...

  6. 多校hdu5726 线段树+预处理

    第一问是没有修改的线段树,第二问暴力预处理,因为gcd的结果不会很多 在预处理阶段需要把每个区间的gcd相等的数量储存起来(用map容器),在一个序列例如:12467,枚举左区间L直到n此处时间为O( ...

  7. hdu-3071 Gcd & Lcm game---质因数分解+状态压缩+线段树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...

  8. CS Academy Gcd on a Circle(dp + 线段树)

    题意 给你一个长为 \(n\) 的环,你可以把它断成任意 \(k\) 段 \((1 < k \le n)\) ,使得每一段的 \(\gcd\) 都 \(>1\) . 问总共有多少种方案,对 ...

  9. Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)

    Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...

随机推荐

  1. 送票啦~ | 京东云邀您参加AI顶级盛会GTC CHINA 2019

    本年度不可错过的AI顶级盛会 GTC CHINA2019 即将于12月16–19日在苏州举行 京东云重量级技术专家将携 AI前沿热议话题亮相 京东云相关AI最新动态,也会一并为您带上 小小剧透,快来看 ...

  2. UML-异常处理

    1.名词解释 缺陷(Fault):错误引起的行为.如:程序员拼写错了数据库名称 错误(Error):缺陷在运行系统中的表现.如:当使用拼写错误的名称调用数据库时,抛出数据库异常 故障(Failure) ...

  3. SAP_MM常用代码

    1.采购申请创建/修改/查看:ME51N/ME52N/ME53N 2.采购申请审批:ME54N 3.采购订单创建/修改/查看:ME21N/ME22N/ME23N 4.单个采购订单审批:ME29N 5. ...

  4. 51nod 1305:Pairwise Sum and Divide

    1305 Pairwise Sum and Divide 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有这样一段 ...

  5. css 的基础样式--border--padding--margin

    border 边框复合写法 border:border-width border-style border-color; border-width 边框宽度 border-style 边框样式:sol ...

  6. 9 react 基础 - 虚拟DOM

    一.虚拟DOM React 原理 1. 存放 state 数据 2. JSX 模版 3. 数据 + 模版 生成虚拟DOM(虚拟DOM就是一个JS 对象, 用来描述真实DOM) eg: ['div', ...

  7. DVWA--文件上传

    开门见山 1. 准备一个shell <?php echo shell_exec($_GET['cmd']);?> 2. 上传文件 3. 利用shell 4. Burp抓包,1是文件大小,2 ...

  8. 自己简单配置webpack

    第一步 // 1.在新建文件夹中,npm init -y,生成package.json文件 // package.json 文件内容 { "name": "02webpa ...

  9. ACwing算法基础课听课笔记(第一章,基础算法一)(二分)

    二分法: 在看这个视频前,我对于二分法是一头雾水的,又加上这个算法平常从来没写过所以打了一年了还没正式搞过.视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开 ...

  10. reference-based measure|Distribution-based measure|密码子使用偏向性

    生命组学 密码子使用偏向性是指同义密码子使用频率不同. 影响因素:1.GC2.横向基因转移3.selection 转录偏好于多的tRNA. 同种氨基酸但有密码子使用偏向. ============== ...