1. 程式人生 > >HDU 6273 Master of GCD 分塊

HDU 6273 Master of GCD 分塊

/**
HDU 6273 Master of GCD 分塊
連結:http://acm.hdu.edu.cn/showproblem.php?pid=6273
題意:給定長度為n初始值為1的陣列,給定m操作l r v,表示區間[l,r]乘以v
ans: 更新後陣列的最大公約數;

分析:分塊 打標記,對於每個位置 ,記錄每個位置2,3的個數;
最後線性掃一遍即可;
*/

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;

const ll mod=998244353;

const int maxn=1e5+7;

int blo,pos[maxn],s2[maxn],s3[maxn],tag2[maxn],tag3[maxn];

void pushdown(int x){
    if(tag2[x]==0&&tag3[x]==0) return ;
    for(int i=(x-1)*blo+1;i<=x*blo;i++) {
        s2[i]+=tag2[x];
        s3[i]+=tag3[x];
    }
    tag2[x]=0,tag3[x]=0;
}

void update(int l,int r,int x){
    for(int i=pos[l]+1;i<=pos[r]-1;i++) {
        if(x==3) tag3[i]++;
        else tag2[i]++;
    }
    if(pos[l]!=pos[r]){
        pushdown(pos[l]),pushdown(pos[r]);
        for(int i=l;i<=pos[l]*blo;i++) {
            if(x==2) s2[i]++;
            else s3[i]++;
        }
        for(int i=(pos[r]-1)*blo+1;i<=r;i++){
            if(x==2) s2[i]++;
            else s3[i]++;
        }
    }
    else {
        pushdown(pos[l]);
        for(int i=l;i<=r;i++){
            if(x==2) s2[i]++;
            else s3[i]++;
        }
    }
}

ll ksm(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}

int main(){
    int t;scanf("%d",&t);
    while(t--){
        int n,m;scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++) s2[i]=s3[i]=tag2[i]=tag3[i]=0;
        blo=(int)sqrt(n*1.0);
        for(int i=1;i<=n;i++) pos[i]=(i-1)/blo+1;
        while(m--){
            int l,r,v;scanf("%d %d %d",&l,&r,&v);
            update(l,r,v);
        }
        int l=1e7+7,r=1e7+7;
        for(int i=1;i<=n;i++){
            s2[i]+=tag2[pos[i]];
            s3[i]+=tag3[pos[i]];
        }
        for(int i=1;i<=n;i++){
            l=min(s2[i],l);
            r=min(s3[i],r);
        }
        ll ans=ksm(2ll,l);
        ans=ans*ksm(3ll,r)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}