社区讨论
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 条回复,欢迎继续交流。
正在加载回复...