题解:AcWing 246 区间最大公约数
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。欢迎大家订阅我的专栏算法题解C与Python实现附上汇总贴算法竞赛备考冲刺必刷题C | 汇总【题目来源】AcWing246. 区间最大公约数 - AcWing题库【题目描述】给定一个长度为N NN的数列A AA以及M MM条指令每条指令可能是以下两种之一C l r d表示把A [ l ] , A [ l 1 ] , … , A [ r ] A[l],A[l1],…,A[r]A[l],A[l1],…,A[r]都加上d dd。Q l r表示询问A [ l ] , A [ l 1 ] , … , A [ r ] A[l],A[l1],…,A[r]A[l],A[l1],…,A[r]的最大公约数G C D GCDGCD)。对于每个询问输出一个整数表示答案。【输入】第一行两个整数N , M N,MN,M。第二行N NN个整数A [ i ] A[i]A[i]。接下来M MM行表示M MM条指令每条指令的格式如题目描述所示。【输出】对于每个询问输出一个整数表示答案。每个答案占一行。【输入样例】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 NN的数列A AA以及M MM条指令支持区间[ l , r ] [l, r][l,r]加d dd和查询区间[ l , r ] [l, r][l,r]的最大公约数。关键在于如何在区间修改的同时高效维护区间 GCD。算法选择差分数组Difference Array将区间加法转化为差分数组的单点修改实现O ( 1 ) O(1)O(1)区间标记线段树Segment Tree维护差分数组的区间 GCD支持单点修改和区间 GCD 查询树状数组Fenwick Tree维护差分数组的前缀和用于快速查询A [ l ] A[l]A[l]的值数学性质利用gcd ⁡ ( a 1 , a 2 , . . . , a n ) gcd ⁡ ( a 1 , a 2 − a 1 , a 3 − a 2 , . . . , a n − a n − 1 ) \gcd(a_1, a_2, ..., a_n) \gcd(a_1, a_2-a_1, a_3-a_2, ..., a_n-a_{n-1})gcd(a1​,a2​,...,an​)gcd(a1​,a2​−a1​,a3​−a2​,...,an​−an−1​)的性质将区间 GCD 转化为差分数组的 GCD关键步骤初始化读取N NN数组长度、M MM指令数、A [ 1.. N ] A[1..N]A[1..N]初始数组构建差分数组b [ i ] A [ i ] − A [ i − 1 ] b[i] A[i] - A[i-1]b[i]A[i]−A[i−1]其中b [ 1 ] A [ 1 ] b[1] A[1]b[1]A[1]树状数组初始化将差分数组b [ i ] b[i]b[i]加入树状数组支持前缀和查询得到A [ i ] A[i]A[i]线段树建立维护差分数组b bb的区间 GCD处理查询指令Q l r通过树状数组前缀和查询A [ l ] ∑ i 1 l b [ i ] A[l] \sum_{i1}^{l} b[i]A[l]∑i1l​b[i]通过线段树查询gcd ⁡ ( b [ l 1 ] , b [ l 2 ] , . . . , b [ r ] ) \gcd(b[l1], b[l2], ..., b[r])gcd(b[l1],b[l2],...,b[r])答案为gcd ⁡ ( A [ l ] , gcd ⁡ ( b [ l 1.. r ] ) ) \gcd(A[l], \gcd(b[l1..r]))gcd(A[l],gcd(b[l1..r]))即gcd ⁡ ( A [ l . . r ] ) \gcd(A[l..r])gcd(A[l..r])若l r l rlr直接输出∣ A [ l ] ∣ |A[l]|∣A[l]∣处理修改指令C l r d树状数组单点修改add(l, d)和add(r1, -d)线段树单点更新update(l, d)和update(r1, -d)若r 1 ≤ n r1 \leq nr1≤n时间/空间复杂度时间复杂度O ( ( N M ) log ⁡ N ) O((N M) \log N)O((NM)logN)线段树和树状数组操作均为O ( log ⁡ N ) O(\log N)O(logN)空间复杂度O ( N ) O(N)O(N)线段树4 N 4N4N 树状数组N NN 原数组线段树维护 GCD 的核心思想差分降维利用gcd ⁡ ( A [ l . . r ] ) gcd ⁡ ( A [ l ] , gcd ⁡ ( b [ l 1.. r ] ) ) \gcd(A[l..r]) \gcd(A[l], \gcd(b[l1..r]))gcd(A[l..r])gcd(A[l],gcd(b[l1..r]))的数学性质将区间修改下的区间 GCD 查询转化为差分数组的区间 GCD 查询区间修改转单点修改对原数组区间[ l , r ] [l, r][l,r]加d dd等价于对差分数组b [ l ] d b[l] db[l]d、b [ r 1 ] − d b[r1] - db[r1]−d仅影响两个端点线段树维护 GCD父节点的 GCD 等于左右子节点 GCD 的 GCD即gcd ⁡ ( l . v , r . v ) \gcd(l.v, r.v)gcd(l.v,r.v)树状数组维护前缀和通过前缀和还原原数组的值A [ l ] A[l]A[l]用于与差分 GCD 合并得到最终答案适用于区间加减与区间 GCD 查询类问题【算法标签】#线段树【代码详解】#includebits/stdc.husingnamespacestd;#defineintlonglong// 将 int 定义为 long long防止数值溢出constintN500005;// 最大数组长度intn,m;// n: 数组长度, m: 指令数intw[N];// 原数组inttr1[N];// 树状数组维护差分数组的前缀和structNode{intl,r,v;// 区间左右端点、区间差分数组的GCD值}tr[N*4];// 线段树数组4倍空间// 树状数组lowbit运算提取x的最低位1对应的2次幂数intlowbit(intx){returnx-x;}// 树状数组单点修改向后修在位置x加上cvoidadd(intx,intc){for(intix;in;ilowbit(i))tr1[i]c;}// 树状数组前缀查询向前查查询[1,x]的和intsum(intx){intres0;for(intix;i;i-lowbit(i))restr1[i];returnres;}// 辗转相除法求GCDintgcd(inta,intb){returnb?gcd(b,a%b):a;}// 线段树向上更新父节点的v 左右子节点v的GCDvoidpushup(intu){autoroottr[u],ltr[u1],rtr[u1|1];tr[u].vgcd(l.v,r.v);}// 线段树建立维护差分数组b[i] w[i] - w[i-1]的GCDvoidbuild(intu,intl,intr){if(lr)// 叶子节点tr[u]{l,r,w[r]-w[r-1]};// 差分数组的值else{tr[u]{l,r};// 初始化当前节点的区间范围intmidlr1;// 取中点等价于 (lr)/2build(u1,l,mid),build(u1|1,mid1,r);// 递归建立左右子树pushup(u);// 向上更新当前节点}}// 线段树区间查询GCDintquery(intu,intl,intr){if(tr[u].lltr[u].rr)// 当前节点区间完全包含在查询区间内returntr[u].v;intmidtr[u].ltr[u].r1;// 取中点intv0;if(lmid)vquery(u1,l,r);// 左子树有贡献if(rmid)vgcd(v,query(u1|1,l,r));// 右子树有贡献与左子树结果取GCDreturnv;}// 线段树单点修改在差分数组位置pos加上dvoidupdate(intu,intpos,intd){if(tr[u].ltr[u].r)// 叶子节点{tr[u].vd;// 差分数组的值增加dreturn;}intmidtr[u].ltr[u].r1;// 取中点if(posmid)update(u1,pos,d);// 在左子树elseupdate(u1|1,pos,d);// 在右子树pushup(u);// 修改后向上更新}signedmain()// 使用 signed 替代 int因为 #define int long long{cinnm;// 读入数组长度和指令数for(inti1;in;i)cinw[i];// 读入原数组// 初始化树状数组将差分数组 b[i] w[i] - w[i-1] 加入树状数组for(inti1;in;i)add(i,w[i]-w[i-1]);build(1,1,n);// 建立线段树维护差分数组区间为[1, n]charop;intl,r,d;while(m--)// 依次处理每条指令{cinop;if(opQ)// 查询指令{cinlr;intleftsum(l);// 树状数组查询A[l]的值差分数组前缀和intrightquery(1,l1,r);// 线段树查询差分数组[l1, r]的GCDif(lr)// 区间长度为1coutabs(left)endl;// 直接输出A[l]的绝对值else// GCD(A[l..r]) GCD(A[l], GCD(b[l1], b[l2], ..., b[r]))// 其中 b[i] A[i] - A[i-1] 为差分数组coutabs(gcd(left,right))endl;}else// 修改指令{cinlrd;// 树状数组区间加d转化为差分数组的两个单点修改add(l,d);add(r1,-d);// 线段树同步更新差分数组的两个端点update(1,l,d);if(r1n)// 注意线段树建到了nupdate(1,r1,-d);}}return0;}【运行结果】5 5 1 3 5 7 9 Q 1 5 1 C 1 5 1 Q 1 5 2 C 3 3 6 Q 2 4 4

相关新闻

局部敏感哈希(LSH)

局部敏感哈希(LSH)

概述 欧式空间中,将高维空间的点映射到低维空间,原本接近的点在低维空间中肯定依然接近,但原本远离的点则有一定概率变成接近的点。 这句话的意思是,在欧氏空间中,使用随机投影等降维映射时,原本距离较近的…

2026/10/12 2:56:56 阅读更多 →
umount 报 “device is busy“解决方法

umount 报 “device is busy“解决方法

查找占用进程 lsof D /挂载点路径例如磁盘挂载在 /mnt/data: lsof D /mnt/data输出会显示 进程ID (PID)、进程名 (COMMAND)、用户 (USER) 和打开的文件名。 优雅终止进程(推荐) kill -15 PID号 # 发送SIGTERM信号,允许进程清理资…

2026/10/12 2:56:35 阅读更多 →
WorkBuddy:AI办公协作工具的高效配置与实战技巧

WorkBuddy:AI办公协作工具的高效配置与实战技巧

1. 为什么WorkBuddy正在重新定义AI办公协作三周前我接手了一个跨国团队的文档协作项目,团队成员分布在5个不同时区。当第7版方案在凌晨3点被不知名成员误删关键段落时,我意识到传统协作工具已经触达效率天花板。这正是WorkBuddy展现魔力的时刻——它不仅…

2026/10/7 1:59:41 阅读更多 →

最新新闻

Windows浏览器多开实战:基于user-data-dir实现独立分身与批量管理

Windows浏览器多开实战:基于user-data-dir实现独立分身与批量管理

先说个结论:Windows下让浏览器“多开”这件事,听起来像是随便点几个窗口就行,但真正想做到“开一百个窗口互不干扰、不串号、不崩溃”,完全不是一回事。这段时间我为了给一套多账号运营工作流做技术验证,把浏览器多开从…

2026/10/12 2:56:41 阅读更多 →
互联网医院源码拆包实战:在线问诊与处方流转全链路解析

互联网医院源码拆包实战:在线问诊与处方流转全链路解析

简介:这份互联网医院源码面向医疗信息化开发者与创业团队,用于快速搭建支持在线问诊与在线开处方的远程医疗服务平台,帮助打破地域限制、提升问诊效率。源码围绕患者与医生的即时沟通展开,涵盖文字聊天、语音视频诊疗、病情描述与…

2026/10/12 2:56:41 阅读更多 →
Vagrant多虚拟机实战:VirtualBox兼容、SSH超时与磁盘清理全记录

Vagrant多虚拟机实战:VirtualBox兼容、SSH超时与磁盘清理全记录

最近在重建开发环境时,卡了我整整两天的一件事,就是在一台宿主机上用 Vagrant 同时管理三台虚拟机:CentOS8、Ubuntu22.04 和 Ubuntu24.04。原以为无非就是装三个 box、写一个 Vagrantfile,然后 vagrant up 一把梭。结果从 Virtual…

2026/10/12 2:56:41 阅读更多 →
点云特征识别实战:从法向量估计到FPFH描述子的关键技术

点云特征识别实战:从法向量估计到FPFH描述子的关键技术

简介:这是一份面向C开发者及三维视觉学习者的点云特征识别项目资料,对应CloudPoint完整工程包。内容围绕点云处理经典流程展开:从统计离群点去除、体素滤波等预处理,到区域分割、关键点检测,再到PFH、FPFH、SHOT等特征…

2026/10/12 2:56:41 阅读更多 →
Netty源码地图:从Channel到EventLoop的请求生命周期解析

Netty源码地图:从Channel到EventLoop的请求生命周期解析

学Netty的人很多,但真正打开过Netty源码的人,比想象中少得多。大多数时候我们停留在“会用”的层面:知道Bootstrap怎么配、ChannelHandler怎么写、EventLoopGroup开几个线程,一旦跑到线上出问题,比如连接积压、内存涨、…

2026/10/12 2:56:41 阅读更多 →
MySQL 64学时教学大纲拆解:从E-R图到PetStore建库全链路

MySQL 64学时教学大纲拆解:从E-R图到PetStore建库全链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:55:40 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →