社区讨论

30pts求调,帮我通过必关注

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi9q9icq
此快照首次捕获于
2025/11/22 11:26
4 个月前
此快照最后确认于
2025/11/22 13:01
4 个月前
查看原帖
样例过了,30分,其他全wa
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5*1e5+5;
int n,q,mod,t[4*N],lz1[4*N],lz2[4*N],op,x,y,k;
void pup(int i){t[i]=t[i*2]+t[i*2+1];t[i]%=mod;}
void pdn(int i,int l,int m,int r){
    if(lz2[i]!=1){
        lz2[i*2]*=lz2[i];lz2[i*2+1]*=lz2[i];
        lz2[i*2]%=mod;lz2[i*2+1]%=mod;
        lz1[i*2]*=lz1[i];lz1[i*2+1]*=lz1[i];
        lz1[i*2]%=mod;lz1[i*2+1]%=mod;
        t[i*2]*=lz2[i];t[i*2+1]*=lz2[i];
        t[i*2]%=mod;t[i*2+1]%=mod;
        lz2[i]=1;
    }
    if(lz1[i]!=0){
        lz1[i*2]+=lz1[i];lz1[i*2+1]+=lz1[i];
        lz1[i*2]%=mod;lz1[i*2+1]%=mod;
        t[i*2]+=(m-l+1)*lz1[i];t[i*2+1]+=(r-m)*lz1[i];
        t[i*2]%=mod;t[i*2+1]%=mod;
        lz1[i]=0;
    }
}
void buid(int l,int r,int i){
    lz2[i]=1;
    if(l==r){
        cin>>t[i];t[i]%=mod;
        return;
    }
    int mid=(l+r)/2;
    buid(l,mid,i*2);
    buid(mid+1,r,i*2+1);
    pup(i);
}
void upd1(int kl,int kr,int k,int l,int r,int i){
    if(l>=kl&&r<=kr){
        t[i]+=(r-l+1)*k;t[i]%=mod;
        lz1[i]+=k;lz1[i]%=mod;
        return;
    }
    int mid=(l+r)/2;
    pdn(i,l,mid,r);
    if(kl<=mid)upd1(kl,kr,k,l,mid,i*2);
    if(kr>mid)upd1(kl,kr,k,mid+1,r,i*2+1);
    pup(i);
}
void upd2(int kl,int kr,int k,int l,int r,int i){
    if(l>=kl&&r<=kr){
        t[i]*=k;t[i]%=mod;
        lz2[i]*=k;lz2[i]%=mod;
        lz1[i]*=k;lz1[i]%=mod;
        return;
    }
    int mid=(l+r)/2;
    pdn(i,l,mid,r);
    if(kl<=mid)upd2(kl,kr,k,l,mid,i*2);
    if(kr>mid)upd2(kl,kr,k,mid+1,r,i*2+1);
    pup(i);
}
int qry(int kl,int kr,int l,int r,int i){
    if(l>=kl&&r<=kr)return t[i];
    int mid=(l+r)/2,num=0;
    pdn(i,l,mid,r);
    if(kl<=mid)num+=qry(kl,kr,l,mid,i*2);
    num%=mod;
    if(kr>mid)num+=qry(kl,kr,mid+1,r,i*2+1);
    num%=mod;
    return num;
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>q>>mod;
    buid(1,n,1);
    for(int i=1;i<=q;i++){
        cin>>op;
        if(op==1){
            cin>>x>>y>>k;
            upd2(x,y,k,1,n,1);
        }else if(op==2){
            cin>>x>>y>>k;
            upd1(x,y,k,1,n,1);
        }else{
            cin>>x>>y;
            cout<<qry(x,y,1,n,1)<<'\n';
        }
    }
    return 0;
}

回复

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

正在加载回复...