P10463 Interval GCD
  • 板块题目总版
  • 楼主lcy0506
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/28 19:59
  • 上次更新2024/7/28 21:06:57
查看原帖
P10463 Interval GCD
1044302
lcy0506楼主2024/7/28 19:59

P10463 Interval GCD

Ybtoj过了,落谷WA

#include <bits/stdc++.h>
using namespace std;
long long a[10000001];
struct node
{
	long long sum,gcd;
}q[10000001];
void build(long long l,long long r,long long k)
{
	if(l==r)
	{
		q[k]={a[l]-a[l-1],a[l]-a[l-1]};
		return;
	}
	long long mid=(l+r)>>1;
	build(l,mid,k<<1);
	build(mid+1,r,k<<1|1);
    q[k].sum=q[k<<1].sum+q[k<<1|1].sum;
	q[k].gcd=__gcd(q[k<<1].gcd,q[k<<1|1].gcd);
}
void query(long long l,long long r,long long k,long long v,long long p)
{
	if(l==r)
	{
		q[p].sum+=v;
		q[p].gcd+=v;
		return;
	}
	long long mid=(l+r)>>1;
	if(k<=mid)
	query(l,mid,k,v,p<<1);
	else
	query(mid+1,r,k,v,p<<1|1);
	q[p].sum=q[p<<1].sum+q[p<<1|1].sum;
	q[p].gcd=__gcd(q[p<<1].gcd,q[p<<1|1].gcd);
}
long long max_sum(long long l,long long r,long long left,long long right,long long k)
{
	if(left<=l&&right>=r)
	{
		return q[k].sum;
	}
	long long mid=(l+r)>>1,res=0;
	if(left<=mid) 
	res+=max_sum(l,mid,left,right,k<<1);
	if(right>mid) 
	res+=max_sum(mid+1,r,left,right,k<<1|1);
	return res;
}
long long max_gcd(long long l,long long r,long long left,long long right,long long k)
{
	if(left<=l&&right>=r)
	{
		return q[k].gcd;
	}
	long long mid=(l+r)>>1,res=0;
	if(left<=mid) 
	res=__gcd(res,max_gcd(l,mid,left,right,k<<1));
	if(right>mid) 
	res=__gcd(res,max_gcd(mid+1,r,left,right,k<<1|1));
	return res;
}
int main()
{
	freopen("gcd.in","r",stdin);
	freopen("gcd.out","w",stdout);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		char g;
		int l,r,z;
		cin>>g>>l>>r;
		if(g=='C')
		{
			cin>>z,query(1,n,l,z,1),r!=n&&(query(1,n,r+1,-z,1),1);
		}
		else if(g=='Q')
		{
			cout<<abs(__gcd(max_gcd(1,n,l+1,r,1),max_sum(1,n,1,l,1)))<<endl;
		}
	}
	return 0;
}
2024/7/28 19:59
加载中...