社区讨论
萌新刚学 OI 3天求调
P3373【模板】线段树 2参与者 7已保存回复 21
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 21 条
- 当前快照
- 1 份
- 快照标识符
- @lo124q0u
- 此快照首次捕获于
- 2023/10/22 13:57 2 年前
- 此快照最后确认于
- 2023/11/02 13:27 2 年前
自己打的线段树抽象板子样例能过但是全 WA
CPP#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0';ch=getchar();}
return s*w;
}
template <typename T>
void write(T x) {
if(x<0){x=-x;putchar('-');}
if(x<=9){putchar(x+'0');return;}
write(x/10);putchar(x%10+'0');
}
struct node{
long long l,r;
long long lazyadd,dat,lazyx;
}t[0x66ccff];
long long a[0x66ccff],m;
void build(int q,int l,int r){
t[q].l=l;
t[q].r=r;
if(l==r){
t[q].dat=a[l];
return;
}
long long mid=(l+r)/2;
build(q*2,l,mid);
build(q*2+1,mid+1,r);
t[q].dat=(t[q*2].dat+t[q*2+1].dat)%m;
}
void lazyadd(int q){
t[q*2].lazyadd+=t[q].lazyadd%m;
t[q*2].dat+=((t[q*2].r-t[q*2].l+1)*t[q].lazyadd)%m;
t[q*2+1].lazyadd+=t[q].lazyadd%m;
t[q*2+1].dat+=((t[q*2+1].r-t[q*2+1].l+1)*t[q].lazyadd)%m;
t[q].lazyadd=0;
}
void lazyx(int q){
t[q*2].lazyx*=t[q].lazyx%m;
t[q*2].dat*=((t[q*2].r-t[2*q].l+1)*t[q].lazyx)%m;
t[q*2+1].lazyx*=t[q].lazyx%m;
t[q*2+1].dat*=((t[q*2+1].r-t[q*2+1].l+1)*t[q].lazyx)%m;
t[q].lazyx=0;
}
void change1(int q,int l,int r,int v){
if(t[q].l>r||t[q].r<l)
return;
if(t[q].l>=l && t[q].r<=r){
(t[q].lazyadd+=v)%=m;
(t[q].dat+=(t[q].r-t[q].l+1)*v%m)%=m;
return;
}
if(t[q].lazyadd>0)
lazyadd(q);
change1(q*2,l,r,v);
change1(q*2+1,l,r,v);
(t[q].dat=(t[q*2].dat+t[q*2+1].dat))%=m;
}
void change2(int q,int l,int r,int v){
if(t[q].l>r||t[q].r<l)
return;
if(t[q].l>=l&&t[q].r<=r){
(t[q].lazyx*=v)%m;
(t[q].dat*=(t[q].r-t[q].l+1)*v%m)%=m;
return;
}
if(t[q].lazyx>0)
lazyx(q);
change2(q*2,l,r,v);
change2(q*2+1,l,r,v);
t[q].dat=t[q*2].dat+t[q*2+1].dat;
}
long long ask(int q,int l,int r){
if(t[q].l>r || t[q].r<l)
return 0;
if(t[q].l>=l && t[q].r<=r)
return t[q].dat;
if(t[q].lazyx>0)
lazyx(q);
if(t[q].lazyadd>0)
lazyadd(q);
return (ask(q*2,l,r)+ask(q*2+1,l,r))%m;
}
int main(){
int n=read(),q=read();
m=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
for(int i=1;i<=q;i++) {
int ans=read();
if(ans==1){
int x=read(),y=read(),k=read();
change2(1,x,y,k);
}
else if(ans==2){
int x=read(),y=read(),k=read();
change1(1,x,y,k);
}
else if(ans==3){
int x=read(),y=read();
cout<<ask(1,x,y)<<"\n";
}
}
}
回复
共 21 条回复,欢迎继续交流。
正在加载回复...