列表

详情


NC25348. GCD Problem

描述


输入描述



输出描述

示例1

输入:

4
5 45 20 65
7
1 1 4
0 1 4
1 1 4
1 3 4
0 3 4
1 3 4
1 2 2

输出:

5
2
4
2
6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 809ms, 内存消耗: 9700K, 提交时间: 2019-04-27 09:14:54

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+5;
int n;
ll tree[N<<1],tag[N<<1];
void pushup(int rt)
{
    tree[rt]=__gcd(tree[rt<<1],tree[rt<<1|1]);
    tag[rt]=tag[rt<<1]&&tag[rt<<1|1];
}
void bulid(int l,int r,int rt)
{
    if(l==r)
    {
        scanf("%lld",&tree[rt]);
        tag[rt]=0;
        return ;
    }
    int mid=(l+r)>>1;
    bulid(l,mid,rt<<1);
    bulid(mid+1,r,rt<<1|1);
    pushup(rt);
}
void update(int l,int r,int rt,int L,int R)
{
    if(tag[rt]) return ;
    if(l==r)
    {
        tree[rt]=sqrt(tree[rt]);
        if(tree[rt]==1) tag[rt]=1;
        return ;
    }
    int mid=l+(r-l)/2;
    if(L<=mid) update(l,mid,rt<<1,L,R);
    if(R>mid) update(mid+1,r,rt<<1|1,L,R);
    pushup(rt);
}
ll query(int l,int r,int rt,int L,int R)
{
    if(tag[rt]&&l<=L&&R<=r) return 1;
    if(L<=l&&R>=r) return tree[rt];
    int mid=l+(r-l)/2;
    if(R<=mid) return query(l,mid,rt<<1,L,R);
    else if(L>mid) return query(mid+1,r,rt<<1|1,L,R);
    else return __gcd(query(l,mid,rt<<1,L,R),query(mid+1,r,rt<<1|1,L,R));
}
int main()
{
    int q;
    scanf("%d",&n);
    bulid(1,n,1);
    scanf("%d",&q);
    while(q--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(a==0) update(1,n,1,b,c);
        else cout<<query(1,n,1,b,c)<<endl;;
    }
    return 0;
}

C++ 解法, 执行用时: 335ms, 内存消耗: 11240K, 提交时间: 2021-12-01 22:19:00

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N=2e5+10;
ll a[N],g[N<<2],ma[N<<2];
void pushup(int rt){
	g[rt]=__gcd(g[rt<<1],g[rt<<1|1]);
	ma[rt]=max(ma[rt<<1],ma[rt<<1|1]);
}
void build(int l,int r,int rt){
	if(l==r){
		g[rt]=a[l],ma[rt]=a[l];
		return;
	}
	int m=(l+r)>>1;
	build(lson);
	build(rson);
	pushup(rt);
}
void update(int L,int R,int l,int r,int rt){
	if(L<=l&&R>=r&&ma[rt]==1){
		return;
	}
	if(l==r){
		g[rt]=(ll)sqrt(g[rt]);
		ma[rt]=(ll)sqrt(ma[rt]);
		return;
	}
	int m=(l+r)>>1;
	if(L<=m) update(L,R,lson);
	if(R>m) update(L,R,rson);
	pushup(rt);
}
ll query(int L,int R,int l,int r,int rt){
	 if(L<=l&&R>=r){
	 	return g[rt];
	 }
	 int m=(l+r)>>1;
	 if(R<=m) return query(L,R,lson);
	 else if(L>m) return query(L,R,rson);
	 else return __gcd(query(L,R,lson),query(L,R,rson));
}
int main(){
	int n,m,op,l,r;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	build(1,n,1);
	scanf("%d",&m);
	while(m--){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1)
			printf("%lld\n",query(l,r,1,n,1));
		else update(l,r,1,n,1);
	}
	return 0;
} 

上一题