70pts 求助
查看原帖
70pts 求助
162191
Dfkuaid楼主2021/2/1 15:10

不清楚是哪里出了问题 QwQ ,有没有dalao指点一下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define INF 0x3fffffff
#define N 200010
#define ll long long
#define mset(l,x) memset(l,x,sizeof(l));
#define mp(a,b) make_pair(a,b)
using namespace std;

struct Node{
    ll l,r;
    int ls,rs;
    ll lazy_add,lazy_mul;
    ll sum;
};
Node p[N * 4];

int n,m,mod;
ll cnt,a[N];

//inline int len(int k){
//    return p[k].r - p[k].l + 1;
//}

inline void pushup(int k){
    p[k].sum = (p[p[k].ls].sum + p[p[k].rs].sum) % mod;
}

inline void update(int k,int l,int r,int mul,int add){
    (p[k].lazy_mul *= mul) %= mod;
    (p[k].lazy_add *= mul) %= mod;
    (p[k].lazy_add += add) %= mod;
    p[k].sum = (p[k].sum * mul + (r - l + 1) * add) % mod;
    if (!p[k].lazy_mul) p[k].lazy_mul = mod;
}

inline void pushdown(int k,int l,int r){
    if (p[k].lazy_add || p[k].lazy_mul > 1){
        ll mid = (l + r) >> 1;
        update(p[k].ls,l,mid,p[k].lazy_mul,p[k].lazy_add);
        update(p[k].rs,mid + 1,r,p[k].lazy_mul,p[k].lazy_add);
        p[k].lazy_add = 0;
        p[k].lazy_mul = 1;
    }
}

inline void modify(int k,int l,int r,int x,int y,int mul,int add){
    if (x <= l && r <= y){
        update(k,l,r,mul,add);
        return;
    }
    pushdown(k,l,r);
    ll mid = (l + r) >> 1;
    if (mid >= x)
      modify(p[k].ls,l,mid,x,y,mul,add);
    if (mid < y)
      modify(p[k].rs,mid + 1,r,x,y,mul,add);
    pushup(k);
}

inline ll query(int k,int l,int r,int x,int y){
    if (x <= l && r <= y)
      return p[k].sum % mod;
    pushdown(k,l,r);
    int mid = (l + r) >> 1;
    ll ans = 0;
    if (mid >= x)
      (ans += query(p[k].ls,l,mid,x,y)) %= mod;
    if (mid < y)
      (ans += query(p[k].rs,mid + 1,r,x,y)) %= mod;
    return ans;
}

inline void build(int x,int y,int k){
    p[k].lazy_mul = 1;
    if (x == y){
        p[k].sum = a[x] % mod;
        p[k].l = p[k].r = x;
        return;
    }
    p[k].l = x,p[k].r = y;
    int mid = (x + y) >> 1;
    p[k].ls = cnt ++;
    build(x,mid,p[k].ls);
    p[k].rs = cnt ++;
    build(mid + 1,y,p[k].rs);
    pushup(k);
}

int main(){
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    scanf("%d%d%d",&n,&m,&mod);
    for (int i = 1;i <= n;i ++)
      scanf("%lld",&a[i]);
    cnt = 1;
    build(1,n,cnt ++);
//    for (int i = 0;i < cnt;i ++)
//      printf("%d [%d,%d] %d %d sum:%d lazy_add:%d lazy_mul:%d\n",i,p[i].l,p[i].r,p[i].ls,p[i].rs,p[i].sum,p[i].lazy_add,p[i].lazy_mul);

    while (m --){
        int op,x,y,k;
        scanf("%d%d%d",&op,&x,&y);
        if (op == 1){
            scanf("%d",&k);
            modify(1,1,n,x,y,k,0);
        }
        else if (op == 2){
            scanf("%d",&k);
            modify(1,1,n,x,y,1,k);
        }
        else printf("%lld\n",query(1,1,n,x,y));
//        for (int i = 0;i < cnt;i ++)
//          printf("%d [%d,%d] %d %d sum:%d lazy_add:%d lazy_mul:%d\n",i,p[i].l,p[i].r,p[i].ls,p[i].rs,p[i].sum,p[i].lazy_add,p[i].lazy_mul);
    }
//    for (int i = 0;i < cnt;i ++)
//      printf("%d [%d,%d] %d %d sum:%d lazy_add:%d lazy_mul:%d\n",i,p[i].l,p[i].r,p[i].ls,p[i].rs,p[i].sum,p[i].lazy_add,p[i].lazy_mul);

//    fclose(stdin);
//    fclose(stdout);
    return 0;
}

2021/2/1 15:10
加载中...