Interval GCD 题解
题目描述
给定一个长度为 的数组 ,以及 条指令 (),每条指令可能是以下两种之一:
“”,表示把 都加上 。
“”,表示询问 的 。
Solve
1.引理#
更相减损术 可利用数学归纳法扩展至
2.思路#
考虑利用差分将区间修改转化为单点修改,用线段树维护区间 ,然后用树状数组维护前缀和以求出 的真实值(也可以用线段树维护)。
3.Code#
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
#define int long long
inline int read()
{
short f=1;
int x=0;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
struct seg
{
int dat,l,r;
#define mid (t[p].l+t[p].r>>1)
#define ls (p<<1)
#define rs (p<<1|1)
#define len(p) (t[p].r-t[p].l+1)
}t[2000010];
int gcd(int x,int y)
{
x=abs(x);y=abs(y);//考虑负数
if(x<y) swap(x,y);
if(!y) return x;//在query中res=0,即y=0,此时直接返回x
return x%y?gcd(y,x%y):y;
}
int n,m,a[500010],c[500010],l,r,d;
char op;
inline void upd(int p)
{
t[p].dat=gcd(t[ls].dat,t[rs].dat);
}
void build(int p,int l,int r)
{
t[p].l=l;t[p].r=r;
if(l==r)
{
t[p].dat=a[l]-a[l-1];
return;
}
build(ls,l,mid);
build(rs,-~mid,r);
upd(p);
}
void change(int p,int pos,int d)
{
if(t[p].l==t[p].r)
{
t[p].dat+=d;
return;
}
if(mid>=pos) change(ls,pos,d);
if(mid<pos) change(rs,pos,d);
upd(p);
}
int query(int p,int l,int r)
{
if(t[p].l>=l&&t[p].r<=r) return t[p].dat;
int res=0;
if(mid>=l) res=gcd(res,query(ls,l,r));
if(mid<r) res=gcd(res,query(rs,l,r));
return res;
}
inline void add(int x,int y) {for(;x<=n;x+=x&-x) c[x]+=y;}
inline int ask(int x) {int res=0;for(;x;x-=x&-x) res+=c[x];return res;}
void print(int p)
{
if(t[p].l==t[p].r)
{
printf("%lld ",t[p].dat);
return;
}
print(ls);print(rs);
}
signed main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i=-~i)
a[i]=read(),add(i,a[i]-a[i-1]);
build(1,1,n);
for(int i=1;i<=m;i=-~i)
{
cin>>op;
l=read();r=read();
if(op=='Q')
printf("%lld\n",gcd(ask(l)/*a[l]的真实值*/,query(1,-~l,r)/*gcd(a[l+1]~a[r])*/));
else
{
d=read();add(l,d);add(-~r,-d),
change(1,l,d);
if(r<n) change(1,-~r,-d);//注意r=n的情况,change会越界导致bug
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探