分块写法求调
查看原帖
分块写法求调
1128230
heyehua555楼主2024/11/12 13:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'

void solve()
{
    int n,q,m;
    cin>>n>>q>>m;

    int len=sqrt(n);
    vector<int>a(n+1),b1(n+1,0),b2(n+1,1),s(n+1,0),id(n+1);
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        id[i]=(i-1)/len+1;
        s[id[i]]+=a[i];
    }a

    auto modify=[&](int l,int r,int x,int y) {
        int sid=id[l],eid=id[r];
        if(sid==eid) {
            for(int i=l;i<=r;i++) s[id[i]]=s[id[i]]-(a[i]*b2[id[i]]+b1[id[i]]),a[i]=(a[i]+x)*y+(y-1)*b1[id[i]],s[id[i]]+=(a[i]*b2[id[i]]+b1[id[i]]),s[id[i]]%=m,a[i]%=m;
        } else {
            for(int i=l;id[i]==sid;i++) s[id[i]]-=(a[i]*b2[id[i]]+b1[id[i]]),a[i]=(a[i]+x)*y+(y-1)*b1[id[i]],s[id[i]]+=(a[i]*b2[id[i]]+b1[id[i]]),s[id[i]]%=m,a[i]%=m;
            for(int i=sid+1;i<eid;i++) b1[i]+=x,b1[i]*=y,b2[i]*=y,s[i]+=len*x,s[i]*=y,b1[i]%m,b2[i]%=m,s[i]%=m;
            for(int i=r;id[i]==eid;i--) s[id[i]]-=(a[i]*b2[id[i]]+b1[id[i]]),a[i]=(a[i]+x)*y+(y-1)*b1[id[i]],s[id[i]]+=(a[i]*b2[id[i]]+b1[id[i]]),s[id[i]]%=m,a[i]%=m;
        }
    };

    auto query=[&](int l,int r) {
        int sid=id[l],eid=id[r],ans=0;
        if(sid==eid) {
            for(int i=l;i<=r;i++) ans+=(a[i]*b2[id[i]]+b1[id[i]]),ans%=m;
        } else {
            for(int i=l;id[i]==sid;i++) ans+=(a[i]*b2[id[i]]+b1[id[i]]),ans%=m;
            for(int i=sid+1;i<eid;i++) ans+=s[i],ans%=m;
            for(int i=r;id[i]==eid;i--) ans+=(a[i]*b2[id[i]]+b1[id[i]]),ans%=m;
        }
        cout<<ans%m<<endl; 
    };

    for(int i=1;i<=q;i++) {
        int op;cin>>op;
        if(op==1) {
            int x,y,k;
            cin>>x>>y>>k;
            modify(x,y,0,k);
        } else if(op==2) {
            int x,y,k;
            cin>>x>>y>>k;
            modify(x,y,k,1);
        } else {
            int x,y;
            cin>>x>>y;
            query(x,y);
        }
    }
}

signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;//cin>>T;
    while(T--) {
        solve();
    }
    return 0;
}
2024/11/12 13:55
加载中...