10分线段树求调,调了2个多小时了,关注*1求大佬们帮助!!!
查看原帖
10分线段树求调,调了2个多小时了,关注*1求大佬们帮助!!!
820210
AndyPomeloMarsGotoHE楼主2023/1/11 17:45

rt,代码如下:

#include <iostream>
#define SIZE 100010
using namespace std;

long long Seq[SIZE],SegTree[SIZE*4],Lzy_add[SIZE*4],Lzy_mul[SIZE*4];
int N,M,P;

inline void pushup(const int u){
    SegTree[u] = (SegTree[u<<1] + SegTree[(u<<1)+1]) % P;
}

inline void maketag(int u,int L,int R,long long val,int type){
    if (type==1){
        (Lzy_add[u] *= val) %= P;
        (Lzy_mul[u] *= val) %= P;
        (SegTree[u] *= val) %= P;
    }
    else{
        (Lzy_add[u] += val) %= P;
        (SegTree[u] += (R-L+1) * val) %= P;
    }
}

void pushdown(int u,int L,int R){
    int M = (L+R) >> 1;
    maketag(u<<1,L,M,Lzy_mul[u],1);
    maketag(u<<1,L,M,Lzy_add[u],2);
    maketag((u<<1)+1,M+1,R,Lzy_mul[u],1);
    maketag((u<<1)+1,M+1,R,Lzy_add[u],2);
    Lzy_mul[u] = 1;
    Lzy_add[u] = 0;
}

void build(int u,int L,int R){
    Lzy_mul[u] = 1;
    Lzy_add[u] = 0;
    if (L==R){
        SegTree[u] = Seq[L] % P;
        return;
    }
    else{
        int M = L + ((R - L) >> 1);
        build(u<<1,L,M),build((u<<1)+1,M+1,R);
        pushup(u);
    }
}

long long sectionquery(int u,int L,int R,int l,int r){
    if ((l<=L) && (R<=r)) return SegTree[u];
    else if (!((L>r) || (R<l))){
        int M = (L+R) >> 1;
        pushdown(u,L,R);
        return (sectionquery(u<<1,L,M,l,r)+sectionquery((u<<1)+1,M+1,R,l,r)) % P;
    }
    else return 0;
}

void sectionupdate(int u,int L,int R,int l,int r,long long val,int type){
    if ((l<=L) && (R<=r)) maketag(u,L,R,val,type);
    else if (!((L>r) || (R<l))){
        int M = (L+R) >> 1;
        pushdown(u,L,R);
        sectionupdate(u<<1,L,M,l,r,val,type);
        sectionupdate((u<<1)+1,M+1,R,l,r,val,type);
        pushup(u);    
    }
}

int main(){
    scanf("%d %d %d", &N, &M, &P);
    for (int i=1;i<=N;i++) scanf("%lld", &SegTree[i]);
    build(1, 1, N);
    while (M--){
        int op, x, y;
        scanf("%d", &op);
        long long k;
        if (op==1){
            scanf("%d %d %lld", &x, &y, &k);
            sectionupdate(1, 1, N, x, y, k, 1);
        }
        else if (op==2){
            scanf("%d %d %lld", &x, &y, &k);
            sectionupdate(1, 1, N, x, y, k, 2);
        }
        else{
            scanf("%d %d", &x, &y);
            printf("%lld\n", sectionquery(1, 1, N, x, y));
        }
    }
    return 0;
}

2023/1/11 17:45
加载中...