MnZn求分块卡常
查看原帖
MnZn求分块卡常
223797
Remake_楼主2020/12/16 20:24

Rt,蒟蒻用分块写的,拿了70pts,其余点都T了>_<,求卡常/kel

#include<bits/stdc++.h>
using namespace std;
#define timeused() (double)clock()/CLOCKS_PER_SEC
#define Set(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define repp(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define debug() assert(0)
typedef long long ll;
typedef unsigned long long ull;
template<typename T> inline T rd(T& x){
    T f=1;x=0;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(T)(c-'0');
    x*=f;
    return x;
}
ll rd(){ll x;rd(x);return x;}
int n,m,p,L[10005],R[10005],opt,l,r,bel[1000005],siz;
ll a[1000005],sum[1000005],addtag[1000005],multag[1000005],k;
inline void res(int be){
    rep(i,L[be],R[be]) a[i]=(a[i]*multag[be]+addtag[be])%p;
    multag[be]=1;
    addtag[be]=sum[be]=0;
    rep(i,L[be],R[be]) sum[be]=(sum[be]+a[i])%p;
    return;
}
inline void upd(int l,int r,ll k,bool type){
    if(!type){
        if(bel[l]==bel[r]){
            res(bel[l]);
            rep(i,l,r){
                sum[bel[l]]=(sum[bel[l]]+a[i]*(k-1))%p;
                a[i]=a[i]*k%p;
            }
            return;
        }
        res(bel[l]);
        for(;l!=L[bel[l]];++l){
            sum[bel[l]]=(sum[bel[l]]+a[l]*(k-1))%p;
            a[l]=a[l]*k%p;
        }
        res(bel[r]);
        for(;r!=R[bel[r]];--r){
            sum[bel[r]]=(sum[bel[r]]+a[r]*(k-1))%p;
            a[r]=a[r]*k%p;
        }
        rep(i,bel[l],bel[r]){
            addtag[i]=addtag[i]*k%p;
            multag[i]=multag[i]*k%p;
            sum[i]=sum[i]*k%p;
        }
        return;
    }
    else{
        if(bel[l]==bel[r]){
            res(bel[l]);
            rep(i,l,r){
                sum[bel[l]]=(sum[bel[l]]+k)%p;
                a[i]=(a[i]+k)%p;
            }
            return;
        }
        res(bel[l]);
        for(;l!=L[bel[l]];++l){
            sum[bel[l]]=(sum[bel[l]]+k)%p;
            a[l]=(a[l]+k)%p;
        }
        res(bel[r]);
        for(;r!=R[bel[r]];--r){
            sum[bel[r]]=(sum[bel[r]]+k)%p;
            a[r]=(a[r]+k)%p;
        }
        rep(i,bel[l],bel[r]){
            addtag[i]=(addtag[i]+k)%p;
            sum[i]=(sum[i]+k*siz)%p;
        }
        return;
    }
}
inline int query(int l,int r){
    ll ans=0;
    if(bel[l]==bel[r]){
        res(bel[l]);
        rep(i,l,r) ans=(ans+a[i])%p;
        return ans; 
    }
    res(bel[l]);
    for(;l!=L[bel[l]];++l) ans=(ans+a[l])%p;
    res(bel[r]);
    for(;r!=R[bel[r]];--r) ans=(ans+a[r])%p;
    rep(i,bel[l],bel[r]) ans=(ans+sum[i])%p;
    return ans;
}
int main(){
    n=rd();
    m=rd();
    p=rd();
    siz=ceil(sqrt(n)+1);
    rep(i,1,n) a[i]=rd();
    rep(i,1,siz){
        L[i]=(i-1)*siz+1;
        R[i]=i*siz;
        addtag[i]=0;
        multag[i]=1;
        rep(j,L[i],R[i]){
            bel[j]=i;
            sum[i]=(sum[i]+a[j])%p;
        }
    }
    while(m--){
        opt=rd();
        if(opt==1){
            l=rd();
            r=rd();
            k=rd();
            upd(l,r,k,0);
        }
        if(opt==2){
            l=rd();
            r=rd();
            k=rd();
            upd(l,r,k,1);
        } 
        if(opt==3){
            l=rd();
            r=rd();
            printf("%d\n",query(l,r));
        }
    }
    return 0;
}

2020/12/16 20:24
加载中...