WA0PTS求调
查看原帖
WA0PTS求调
1410665
Nameless2333333楼主2025/6/16 17:57

对着题解改到除了码风都一样了,不知道为什么还是WA0PTS。 能过样例,这里给一组不能通过测试数据 。

IN:

8 10 571373 5929 7152 8443 6028 8580 5449 8473 4237 2 4 8 4376 1 2 8 9637 2 2 6 7918 2 5 8 5681 3 2 8 1 1 5 6482 3 1 5 1 5 8 8701 2 5 8 7992 2 5 8 7806

OUT:

478836 562114

code:

#include<bits/stdc++.h>
#define int long long
#define up(x) sum[x]=(sum[x<<1]+sum[(x<<1)|1])%mod
using namespace std;
const int N=1e5+5;
int n,m,mod,a[N],sum[N*4],l1[N*4],l2[N*4];
void dowm(int l,int r,int i){
    int mid=(l+r)>>1;
    sum[i<<1]=(sum[i<<1]*l1[i])%mod;
    sum[(i<<1)|1]=(sum[(i<<1)|1]*l1[i])%mod;
    sum[i<<1]=(sum[i<<1]+(mid-l+1)*l2[i])%mod;
    sum[(i<<1)|1]=(sum[(i<<1)|1]+(r-mid)*l2[i])%mod;
    l1[i<<1]=(l1[i<<1]*l1[i])%mod;
    l1[(i<<1)|1]=(l1[(i<<1)|1]*l1[i])%mod;
    l2[i<<1]=(l2[i<<1]*l1[i]+l2[i])%mod;
    l2[(i<<1)|1]=(l2[(i<<1)|1]*l1[i]+l2[i])%mod;
    l1[i]=1;
    l2[i]=0;
}
void build(int l,int r,int i){
    l1[i]=1;
    l2[i]=0;
    if(l==r){ sum[i]=(a[l])%mod; return;}
    int mid=(l+r)>>1;
    build(l,mid,i<<1);
    build(mid+1,r,(i<<1)|1);
    up(i);
}
void add1(int li,int ri,int k,int l,int r,int i){
    if(li<=l&&ri>=r) {l1[i]=(l1[i]*k)%mod; l2[i]=(l2[i]*k)%mod; sum[i]=(sum[i]*k)%mod; return ;}
    int mid=(l+r)>>1;
    // if(l2[i]||l1[i]!=1) 
        dowm(l,r,i);
    if(mid>=li) add1(li,ri,k,l,mid,i<<1);
    if(mid+1<=ri) add1(li,ri,k,mid+1,r,(i<<1)|1);
    up(i);
}
void add2(int li,int ri,int k,int l,int r,int i){
    if(li<=l&&ri>=r) {l2[i]=(l2[i]+k)%mod; sum[i]=(sum[i]+k*(r-l+1))%mod; return;}
    int mid=(l+r)>>1;
    // if(l2[i]||l1[i]!=1) 
        dowm(l,r,i);
    if(mid>=li) add2(li,ri,k,l,mid,i<<1);
    if(mid+1<=ri) add2(li,ri,k,mid+1,r,(i<<1)|1);
    up(i);
}
int q(int li,int ri,int l,int r,int i){
    int res=0,mid=(l+r)>>1;
    if(li<=l&&ri>=r) return sum[i];
    // if(l2[i]||l1[i]!=1) 
        dowm(l,r,i);
    if(mid>=li) res=(res+q(li,ri,l,mid,i<<1))%mod;
    if(mid+1<=ri) res=(res+q(li,ri,mid+1,r,(i<<1)|1))%mod;
    return res%mod;
}
signed main(){
    scanf("%lld%lld%lld",&n,&m,&mod);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,n,1);
    for(int i=1,x,y,z;i<=m;i++){
        scanf("%lld",&x);
        if(x==1){
            scanf("%lld%lld%lld",&x,&y,&z);
            add1(x,y,z,1,n,1);
        }
        if(x==2){
            scanf("%lld%lld%lld",&x,&y,&z);
            add2(x,y,z,1,n,1);
        }
        if(x==3){
            scanf("%lld%lld",&x,&y);
            int ans=q(x,y,1,n,1)%mod;
            printf("%lld\n",ans);
        }
    }
    return 0;
}
2025/6/16 17:57
加载中...