【线段树求区间GCD(只有2,3)】CCPC2017 杭州站 HDU6273

http://acm.hdu.edu.cn/showproblem.php?pid=6273

给你n个数,Q次操作,每次操作,选一段区间乘2或者乘3

最后询问所有的数的GCD是多少

解法:初始都为1,只管区间更新次数,和区间左右儿子更新次数,下面加上来的

 

#include 
#define ll long long
using namespace std;
const ll mod=998244353;
const int maxn=1e5+10;
struct node
{
    //two[0],three[0],表示这个区间更新的次数
    //two[1],three[1],表示左儿子右儿子更新次数取min,
    int two[2];
    int three[2];
}tree[maxn*4];


void update(int l,int r,int rt,int L,int R,int k)
{
    if(l>=L&&r<=R)
    {
        if(k==2)
            tree[rt].two[0]++;
        else
            tree[rt].three[0]++;
        return;
    }
    int mid=(l+r)/2;
    if(L<=mid) update(l,mid,2*rt,L,R,k);
    if(R>mid) update(mid+1,r,2*rt+1,L,R,k);
    cout<r)
                swap(l,r);
            update(1,n,1,l,r,x);
        }
        ll ans=1;
        int t=tree[1].two[0]+tree[1].two[1];
        while(t--)
        {
            ans=ans*2%mod;
        }
        t=tree[1].three[0]+tree[1].three[1];
        while(t--)
        {
            ans=ans*3%mod;
        }
        printf("%lld\n",ans);
    }


    return 0;
}

 

你可能感兴趣的:(线段树)