社区讨论
三十分只过1,3,4求助,调了一个小时了
P3373【模板】线段树 2参与者 5已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @lymykyai
- 此快照首次捕获于
- 2024/07/15 20:26 2 年前
- 此快照最后确认于
- 2024/07/15 21:26 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[23103222],w[12323232];
int mx[12032132];
int laz[23023213];
int che[21321032];
int d;
void build(int id,int l,int r){
che[id]=1;
laz[id]=0;
if(l==r){
w[id]=a[l];
w[id]=w[id]%d;
return;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
w[id]=w[id<<1]+w[id<<1|1];
w[id]=w[id]%d;
return ;
}
void push_down(int id,int l,int r){
int mid=l+r>>1;
w[id<<1]=che[id]*w[id<<1]+(mid-l+1)*laz[id];
w[id<<1|1]=che[id]*w[id<<1|1]+(r-mid)*laz[id];
laz[id<<1]+=laz[id];
laz[id<<1|1]+=laz[id];
che[id<<1]*=che[id];
che[id<<1|1]*=che[id];
laz[id<<1]=laz[id<<1]%d;
laz[id<<1|1]=laz[id<<1|1]%d;
che[id<<1]=che[id<<1]%d;
che[id<<1|1]=che[id<<1|1]%d;
w[id<<1]=w[id<<1]%d;
w[id<<1|1]=w[id<<1|1]%d;
che[id]=1;
laz[id]=0;
}
int find(int id,int l,int r,int L,int R){
if(L==l&&R==r){
return w[id]%d;
}
push_down(id,l,r);
int mid=l+r>>1;
if(R<=mid) return find(id<<1,l,mid,L,R)%d;
else if(L>mid) return find(id<<1|1,mid+1,r,L,R)%d;
else return (find(id<<1,l,mid,L,mid)+find(id<<1|1,mid+1,r,mid+1,R))%d;
}
void update(int id,int l,int r,int L,int R,int c,int op){
if(l==L&&R==r){
if(op==2){
w[id]+=(r-l+1)*c;
laz[id]+=c;
w[id]=w[id]%d;
laz[id]=laz[id]%d;
return ;
}
else{
w[id]*=c;
che[id]*=c;
laz[id]*=c;
w[id]=w[id]%d;
che[id]=che[id]%d;
laz[id]=laz[id]%d;
return ;
}
}
int mid=l+r>>1;
push_down(id,l,r);
if(R<=mid) update(id<<1,l,mid,L,R,c,op);
else if(L>mid)update(id<<1|1,mid+1,r,L,R,c,op);
else update(id<<1,l,mid,L,mid,c,op),update(id<<1|1,mid+1,r,mid+1,R,c,op);
w[id]=w[id<<1]+w[id<<1|1];
w[id]=w[id]%d;
return ;
}
main(){
cin>>n>>m>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
update(1,1,n,l,r,x,op);
}
else if(op==2){
int l,r,x;
cin>>l>>r>>x;
update(1,1,n,l,r,x,op);
}
else if(op==3){
int l,r;
cin>>l>>r;
cout<<find(1,1,n,l,r)%d<<endl;
}
}
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...