TLE on #15
查看原帖
TLE on #15
610557
shinzanmonoszm 妹妹楼主2023/9/5 20:18
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
const int sz=1e5+10;
const int sqsz=330;
const int mod=998244353;
int fact[sz*100],inv[sz*100];
int qpow(int base,int exp){
    int ans=1;
    while(exp!=0){
        if(exp&1)ans=1ll*ans*base%mod;
        base=1ll*base*base%mod,exp>>=1;
    }
    return ans;
}
int arr[sz],belong[sz],bl[sqsz],br[sqsz],fa[sqsz][sz],indeg[sz],sum[sqsz],mul[sqsz];
short bcnt[sqsz][sz];
std::vector<int>graph[sz];
void dfs(int u,int c){
    arr[u]=c;
    for(int v:graph[u])dfs(v,c);
    graph[u].clear();
}
void update(int id){
    for(int i=bl[id];i<=br[id];i++)
        bcnt[id][arr[i]]=0,fa[id][arr[i]]=0;
    for(int i=bl[id];i<=br[id];i++)
        if(indeg[i]==0)dfs(i,arr[i]);
    std::fill(indeg+bl[id],indeg+br[id]+1,0);
}
void build(int id){
    sum[id]=0,mul[id]=1;
    for(int i=bl[id];i<=br[id];i++){
        if(fa[id][arr[i]]==0)fa[id][arr[i]]=i;
        else graph[fa[id][arr[i]]].push_back(i),indeg[i]++;
        mul[id]=1ll*mul[id]*inv[arr[i]]%mod;
        sum[id]=(sum[id]+arr[i])%mod;
        bcnt[id][arr[i]]++;
    }
}
void modify(int l,int r,int x,int y){
    if(belong[l]==belong[r]){
        update(belong[l]);
        for(int i=l;i<=r;i++)
            if(arr[i]==x)arr[i]=y;
        build(belong[l]);
        return;
    }
    update(belong[l]);
    for(int i=l;i<=br[belong[l]];i++)if(arr[i]==x)arr[i]=y;
    build(belong[l]);
    update(belong[r]);
    for(int i=bl[belong[r]];i<=r;i++)if(arr[i]==x)arr[i]=y;
    build(belong[r]);
    for(int i=belong[l]+1;i<belong[r];i++){
        if(fa[i][y]==0)fa[i][y]=fa[i][x],arr[fa[i][x]]=y;
        else graph[fa[i][y]].push_back(fa[i][x]),indeg[fa[i][x]]++;
        sum[i]=(sum[i]+1ll*bcnt[i][x]*y%mod-1ll*bcnt[i][x]*x%mod+mod)%mod;
        mul[i]=1ll*mul[i]*qpow(fact[x],bcnt[i][x])%mod*qpow(inv[y],bcnt[i][x])%mod;
        bcnt[i][y]+=bcnt[i][x],bcnt[i][x]=0,fa[i][x]=0;
    }
}
int query(int l,int r){
    int s=0,m=1;
    if(belong[l]==belong[r]){
        update(belong[l]);
        for(int i=l;i<=r;i++)
            s=(s+arr[i])%mod,m=1ll*m*inv[arr[i]]%mod;
        build(belong[l]);
        return 1ll*fact[s]*m%mod;
    }
    update(belong[l]);
    for(int i=l;i<=br[belong[l]];i++)
        s=(s+arr[i])%mod,m=1ll*m*inv[arr[i]]%mod;
    build(belong[l]);
    update(belong[r]);
    for(int i=bl[belong[r]];i<=r;i++)
        s=(s+arr[i])%mod,m=1ll*m*inv[arr[i]]%mod;
    build(belong[r]);
    for(int i=belong[l]+1;i<belong[r];i++)s=(s+sum[i])%mod,m=1ll*m*mul[i]%mod;
    return 1ll*fact[s]*m%mod;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n,q;
    std::cin>>n>>q;
    fact[0]=1;
    for(int i=1;i<=1e7;i++)fact[i]=1ll*fact[i-1]*i%mod;
    inv[10000000]=qpow(fact[10000000],mod-2);
    for(int i=1e7-1;i>=0;i--)inv[i]=1ll*inv[i+1]*(i+1)%mod;
    for(int i=1;i<=n;i++)std::cin>>arr[i];
    int lim=std::sqrt(n)+1,num=n/lim;
    for(int i=1;i<=num;i++)
        bl[i]=br[i-1]+1,br[i]=i*lim;
    if(br[num]!=n)
        ++num,bl[num]=br[num-1]+1,br[num]=n;
    for(int i=1;i<=num;i++)
        for(int j=bl[i];j<=br[i];j++)belong[j]=i;
    for(int i=1;i<=num;i++)build(i);
    while(q--){
        int op,l,r,x,y;
        std::cin>>op>>l>>r;
        if(op==2)std::cout<<query(l,r)<<"\n";
        else{
            std::cin>>x>>y;
            if(x==y)continue;
            modify(l,r,x,y);
        }
    }
    return 0;
}
2023/9/5 20:18
加载中...