社区讨论

数据范围不是1e5吗,为啥只有我要开1e6?

P3373【模板】线段树 2参与者 6已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mihe3rke
此快照首次捕获于
2025/11/27 20:08
3 个月前
此快照最后确认于
2025/11/28 22:20
3 个月前
查看原帖
RT,但是
我RE了,然后把范围改成 1e61e6
?????
RE code:
CPP
#include<iostream>
#include<algorithm>
#include<cstring>
#include<array>
using namespace std;

#define int long long

const int MAXN = 1e5+5;

int m;
array<int,MAXN> a;

struct SegmentTree{
    int l,r;
    int lazy1,lazy2;
    int sum;
}t[MAXN<<2];
#define ls (p<<1)
#define rs (p<<1|1)
void build(int p,int l,int r){
    t[p].l=l,t[p].r=r,t[p].lazy1=0,t[p].lazy2=1;
    if(l==r) t[p].sum=a[l];
    else{
        int mid=(l+r)>>1;
        build(ls,l,mid),build(rs,mid+1,r);
        t[p].sum=t[ls].sum+t[rs].sum;
    }
    t[p].sum%=m;
}
void pushdown(int p){
    if(t[p].lazy2!=1){
        t[ls].lazy2*=t[p].lazy2;
        t[rs].lazy2*=t[p].lazy2;
        t[ls].sum*=t[p].lazy2;
        t[rs].sum*=t[p].lazy2;
        t[ls].lazy1*=t[p].lazy2;
        t[rs].lazy1*=t[p].lazy2;
        t[p].lazy2=1;
    }
    if(t[p].lazy1!=0){
        t[ls].lazy1+=t[p].lazy1;
        t[rs].lazy1+=t[p].lazy1;
        t[ls].sum+=(t[ls].r-t[ls].l+1)*t[p].lazy1;
        t[rs].sum+=(t[rs].r-t[rs].l+1)*t[p].lazy1;
        t[p].lazy1=0;
    }
    t[ls].lazy1%=m,t[ls].lazy2%=m,t[ls].sum%=m;
    t[rs].lazy1%=m,t[rs].lazy2%=m,t[rs].sum%=m;
}
void update1(int p,int l,int r,int k){
    int pl=t[p].l,pr=t[p].r;
    if(pl>r||pr<l) return;
    pushdown(p);
    if(pl>=l&&pr<=r) t[p].lazy1+=k,t[p].sum+=(pr-pl+1)*k;
    else{
        update1(ls,l,r,k),update1(rs,l,r,k);
        t[p].sum=t[ls].sum+t[rs].sum;
    }
    t[p].lazy1%=m,t[p].lazy2%=m,t[p].sum%=m;
}
void update2(int p,int l,int r,int k){
    int pl=t[p].l,pr=t[p].r;
    if(pl>r||pr<l) return;
    pushdown(p);
    if(pl>=l&&pr<=r) t[p].lazy1*=k,t[p].lazy2*=k,t[p].sum*=k;
    else{
        update2(ls,l,r,k),update2(rs,l,r,k);
        t[p].sum=t[ls].sum+t[rs].sum;
    }
    t[p].lazy1%=m,t[p].lazy2%=m,t[p].sum%=m;
}
int query(int p,int l,int r){
    int pl=t[p].l,pr=t[p].r;
    if(pl>r||pr<l) return 0;
    pushdown(p);
    if(pl>=l&&pr<=r) return t[p].sum%m;
    else return (query(ls,l,r)+query(rs,l,r))%m;
}

int n,q;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);

    cin>>n>>q>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);

    while(q--){
        int opt;cin>>opt;
        if(opt==1){
            int x,y,k;cin>>x>>y>>k;
            update2(1,x,y,k%m);
        }else if(opt==2){
            int x,y,k;cin>>x>>y>>k;
            update1(1,x,y,k%m);
        }else if(opt==3){
            int x,y;cin>>x>>y;
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...