AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 246. 区间最大公约数    原题链接    困难

作者: 作者的头像   转基因 ,  2025-06-05 21:03:18 · 安徽 ,  所有人可见 ,  阅读 3


0


`#include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

include[HTML_REMOVED]

define endl ‘\n’

using namespace std;
using ll = long long;
using llu = unsigned long long;
const ll inf = 0x3f3f3f3f3f3f3f3fll;
const ll MIN = -9187201950435737472ll;
ll base = 131;
const int N = 5e5 + 10;
ll a[N],d[N],n,m,l,r,x,c[N];
char ty;
ll gcd(ll a,ll b)
{
return (b==0?a:gcd(b,a%b));
}
struct node{
ll val;
}seg[N4];
void motify(int x,ll d)
{
while(x<=n)
{
c[x]+=d;
x+=x&-x;
}
}
ll query(int x)
{
ll res=0;
while(x)
{
res+=c[x];
x-=x&-x;
}
return res;
}
void updata(int id)
{
seg[id].val=abs(gcd(seg[id
2].val,seg[id2+1].val));
}
void change(int id,int l,int r,int x,ll d)
{
if(l==r&&l==x)
{
seg[id].val+=d;
return;
}
int mid=(l+r)>>1;
if(x<=mid)change(id
2,l,mid,x,d);
else change(id2+1,mid+1,r,x,d);
updata(id);
}
ll ask(int id,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr)
{
return abs(seg[id].val);
}
int mid=(l+r)>>1;
if(qr<=mid)return ask(id
2,l,mid,ql,qr);
else if(ql>mid) return ask(id2+1,mid+1,r,ql,qr);
else
{
return abs(gcd(ask(id
2,l,mid,ql,mid),ask(id2+1,mid+1,r,mid+1,qr)));
}
}
void build(int id,int l,int r)
{
if(l==r)
{
seg[id].val=d[l];
return;
}
int mid=(l+r)>>1;
build(id
2,l,mid);
build(id*2+1,mid+1,r);
updata(id);
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i)cin>>a[i];
for(int i=1;i<=n;i
)d[i]=a[i]-a[i-1];
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>ty;
if(ty==’C’)
{
cin>>l>>r>>x;
motify(l,x);
motify(r+1,-x);
change(1,1,n,l,x);
if(r+1<=n)change(1,1,n,r+1,-x);
}
else if(ty==’Q’)
{
cin>>l>>r;
ll x=a[l]+query(l);
ll y=x;
if(l+1<=r)y=ask(1,1,n,l+1,r);
cout<<gcd(x,y)<<endl;
//cout<<x<<” “<<y<<endl;
}
}
return 0;
}

 ` `` ` 

`

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息