分块10分wa求助
查看原帖
分块10分wa求助
125018
ztasd楼主2020/8/22 18:08

题目:https://www.luogu.com.cn/problem/P2023

大佬们能帮我康康代码吗,实在找不到错误了qwq

#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
typedef long long ll;
ll n,m;
ll p,a[MAXN];
ll sqrtn;
ll block[MAXN],lazy_mul[MAXN],lazy_plus[MAXN];
ll cnt_block,l[MAXN],r[MAXN],belong[MAXN];
void build(){
    for(ll i=1;i<=sqrtn;i++){
        l[i]=r[i-1]+1;
        r[i]=l[i]+sqrtn-1;
        cnt_block++;
    }
    if(r[cnt_block]<n){
        cnt_block++;
        l[cnt_block]=r[cnt_block-1]+1;
        r[cnt_block]=n;
    }
    for(ll i=1;i<=cnt_block;i++){
        for(ll j=l[i];j<=r[i];j++){
            block[i]+=a[j];
            belong[j]=i;
        }
        lazy_mul[i]=1;
    }
}
void push_down(ll num){
    if(lazy_mul[num]!=1){
        for(ll i=l[num];i<=r[num];i++){
            a[i]=a[i]*lazy_mul[num]%p;
        }
        lazy_mul[num]=1;
    }
    if(lazy_plus[num]!=0){
        for(ll i=l[num];i<=r[num];i++){
            a[i]=(a[i]+lazy_plus[num])%p;
        }
        lazy_plus[num]=0;
    }
}
void push_up(ll num){
    block[num]=0;
    for(int i=l[num];i<=r[num];i++){
        block[num]+=a[i];
        block[num]%=p;
    }
}
ll query(ll L,ll R){
    ll ret=0;
    push_down(belong[L]);
    push_down(belong[R]);
    if(belong[L]==belong[R]){
        for(ll i=L;i<=R;i++){
            ret+=a[i];
            ret%=p;
        }
    }else{
        for(ll i=L;i<=r[belong[L]];i++){
            ret+=a[i];
            ret%=p;
        }
        L=l[belong[L]+1];
        for(ll i=l[belong[R]];i<=R;i++){
            ret+=a[i];
            ret%=p;
        }
        R=r[belong[R]-1];
        for(ll i=belong[L];i<=belong[R];i++){
            ret+=block[i];
            ret%=p;
        }
    }
    return ret;
}
void modify_plus(ll L,ll R,ll c){
    push_down(belong[L]);
    push_down(belong[R]);
    if(belong[L]==belong[R]){
        for(ll i=L;i<=R;i++){
            a[i]=(a[i]+c)%p;
        }
    }else{
        for(ll i=L;i<=r[belong[L]];i++){
            a[i]=(a[i]+c)%p;
        }
        push_up(belong[L]);
        L=l[belong[L]+1];
        for(ll i=l[belong[R]];i<=R;i++){
            a[i]=(a[i]+c)%p;
        }
        push_up(belong[R]);
        R=r[belong[R]-1];
        for(ll i=belong[L];i<=belong[R];i++){
            block[i]=(block[i]+c*(r[i]-l[i]+1))%p;
            lazy_plus[i]=(lazy_plus[i]+c)%p;
        }
    }
}
void modify_mul(ll L,ll R,ll c){
    push_down(belong[L]);
    push_down(belong[R]);
    if(belong[L]==belong[R]){
        for(ll i=L;i<=R;i++){
            a[i]=(a[i]*c)%p;
        }
    }else{
        for(ll i=L;i<=r[belong[L]];i++){
            a[i]=(a[i]*c)%p;
        }
        push_up(belong[L]);
        L=l[belong[L]+1];
        for(ll i=l[belong[R]];i<=R;i++){
            a[i]=(a[i]*c)%p;
        }
        push_up(belong[R]);
        R=r[belong[R]-1];
        for(ll i=belong[L];i<=belong[R];i++){
            block[i]=(block[i]*c)%p;
            lazy_mul[i]=(lazy_mul[i]*c)%p;
        }
    }
}
int main(){
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    scanf("%lld%lld",&n,&p);
    sqrtn=sqrt(n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",a+i);
    }
    build();
    scanf("%lld",&m);
    while(m--){
        ll op;
        scanf("%lld",&op);
        if(op==1){
            ll l,r,c;
            scanf("%lld%lld%lld",&l,&r,&c);
            modify_mul(l,r,c);
        }else if(op==2){
            ll l,r,c;
            scanf("%lld%lld%lld",&l,&r,&c);
            modify_plus(l,r,c);
        }else if(op==3){
            ll l,r;
            scanf("%lld%lld",&l,&r);
            printf("%lld\n",query(l,r));
        }
    }
    return 0;
}
/*5 38
1 5 4 2 3
5
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4*/
/*8 571373
5929 7152 8443 6028 8580 5449 8473 4237
10
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
*/

2020/8/22 18:08
加载中...