acwing-246. 区间最大公约数(线段树+gcd)[通俗易懂]

acwing-246. 区间最大公约数(线段树+gcd)[通俗易懂]给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一: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 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围N≤500000,M≤1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:

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 个整数 A[i]。

接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。

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

每个答案占一行。

数据范围
N≤500000,M≤100000,
1≤A[i]≤1018,
|d|≤1018

输入样例:
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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
#define lson u << 1
#define rson u << 1 | 1
struct Node{ 
   
    int l,r;
    ll gcd,sum;
}trie[N * 4];
ll a[N],d[N];
int gcd(int a,int b){ 
   
    return b == 0 ? a : gcd(b, a % b);
}
void pushup(int u){ 
   
    trie[u].sum = trie[lson].sum + trie[rson].sum;
    trie[u].gcd = gcd(trie[lson].gcd,trie[rson].gcd);
}
void build(int u,int l,int r){ 
   
    if(l == r)trie[u] = { 
   l,r,d[l],d[l]};
    else{ 
   
        trie[u] = { 
   l,r};
        int mid = (l + r) >> 1;
        build(lson,l,mid);
        build(rson,mid + 1,r);
        pushup(u);
    }
}
void modify(int u,int x,ll y){ 
   
    if(trie[u].l == x && trie[u].r == x)trie[u].sum += y,trie[u].gcd += y;
    else{ 
   
        int mid = (trie[u].l + trie[u].r) >> 1;
        if(x <= mid)modify(lson,x,y);
        else modify(rson,x,y);
        pushup(u);
    }
}
Node query(int u,int l,int r){ 
   
    if(trie[u].l >= l && trie[u].r <= r){ 
   
        Node t;
        t.sum = trie[u].sum;
        t.gcd = trie[u].gcd;
    
        return t;
    }
    int mid = (trie[u].l + trie[u].r) >> 1;
    if(r <= mid)return query(lson,l,r);
    else if(l > mid)return query(rson,l,r);
    else{ 
   
        auto left = query(lson,l,r),right = query(rson,l,r);
        Node t;
        t.sum = left.sum + right.sum;
        t.gcd = gcd(left.gcd,right.gcd);
        return t;
    }
}

int main(){ 
   
    int n,m;
    cin>>n>>m;
    ios::sync_with_stdio(false);
    for(int i = 1;i <= n;i ++){ 
   
        cin>>a[i];
        d[i] = a[i] - a[i - 1];
    }
    build(1,1,n + 1);
    char t;
    ll x,y,dd;
    for(int i = 0;i < m;i ++){ 
   
        cin>>t>>x>>y;
        if(t == 'C')cin>>dd;
        if(x > y)swap(x,y);
        if(t == 'C'){ 
   
            modify(1,x,dd);
            modify(1,y + 1,-dd);
        }
        else{ 
   
            auto left = query(1,1,x),right = query(1,x + 1,y);
            cout<<gcd(left.sum,right.gcd)<<endl;
        }
    }
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168603.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 思维导图整理大厂面试高频数组26: 合并区间中详解lambada表达式和toArray()用法, 力扣56

    思维导图整理大厂面试高频数组26: 合并区间中详解lambada表达式和toArray()用法, 力扣56此专栏文章是对力扣上算法题目各种方法的总结和归纳,整理出最重要的思路和知识重点并以思维导图形式呈现,当然也会加上我对导图的详解.目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解),毕竟算法不是做了一遍就能完全记住的.所以本文适合已经知道解题思路和方法,想进一步加强理解和记忆的朋友,并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解,然后再看本文内容).关于本专栏所有题目的目录链接,刷算法题目的顺序/注意点/技巧,以及思维导图源文件问题请点击此链接.想进大厂.

    2022年5月14日
    54
  • 金税盘计算机USB无法识别,金税盘连接电脑无法识别怎么回事?「建议收藏」

    金税盘计算机USB无法识别,金税盘连接电脑无法识别怎么回事?「建议收藏」金税盘连接电脑无法识别怎么回事?答:部分情况可能是因为USB供电不稳定,造成金税盘驱动无法正常运行;建议电脑重启,金税盘数据线重新插拔一下或者更换一个USB端口连接试试.如果多次尝试无效,则需要联系服务单位处理.金税盘使用增值税防伪税控系统,可开具增值税专用发票和增值税普通发票,营改增试点地区和行业一般纳税人(提供货物运输服务的纳税人除外)适用.税控盘使用货物运输业专用发票税控系统,可开具货物运输…

    2022年6月11日
    131
  • 聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包[通俗易懂]

    聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包[通俗易懂]聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包前言分析页面具体实现解析页面获取网页内容解析网页内容文件下载多线程下载成果总结前言事情要从几天前说起,我有一个朋友,他在和他喜欢的小姐姐聊天时,聊天的气氛一直非常尬,这时他就想发点表情包来缓和一下气氛,但一看自己的表情包收藏都是这样的。。。。。。这发过去,基本就直接和小姐姐说拜拜了,然后他就向我求救问我有没有表情包,表情包我是没有,但网站有呀,来来,爬虫整起。分析页面今天爬取的网站是斗图吧,有一说一表情包是真的多,看这惊人的页数

    2022年5月11日
    36
  • DB9 公头母头引脚定义及连接

    DB9 公头母头引脚定义及连接

    2021年8月30日
    81
  • c语言求n个数的中位数_众数中位数平均数的特点

    c语言求n个数的中位数_众数中位数平均数的特点记录一下之前困扰了我很久的中位数和众数的函数TvT#include<stdio.h>#include<stdlib.h>#defineN40doubleAverage(intfeedback[N]);doubleMedian(intfeedback[N]);intMode(intfeedback[N],intb[]);intmain(){intfeedback[N]={0},b[N]={0};intmodnum=0

    2022年9月17日
    1
  • python中exec 和eval的用法[通俗易懂]

    python中exec 和eval的用法[通俗易懂]https://www.mojidong.com/post/2013-05-10-python-exec-eval/

    2022年7月6日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号