萌新刚学 OI 3天求调

P3373 【模板】线段树 2

@[Vsinger_洛天依](/user/1000298) ,你lazyx函数中lazyadd也要乘
by 赛克尔だよ @ 2023-10-16 16:49:29


@[赛克尔だよ](/user/376348) 谢谢谢谢
by Vsinger_洛天依 @ 2023-10-16 16:50:04


我去试试
by Vsinger_洛天依 @ 2023-10-16 16:51:45


Orz好像还是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].lazyadd*=t[q].lazyx%m; t[q*2].lazyadd*=t[q].lazyx%m; t[q*2+1].lazyadd*=t[q].lazyx%m; 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"; } } }
by Vsinger_洛天依 @ 2023-10-16 16:55:02


@[Vsinger_洛天依](/user/1000298) 等我一下,我再调
by 赛克尔だよ @ 2023-10-16 17:07:24


@[赛克尔だよ](/user/376348) 谢谢您
by Vsinger_洛天依 @ 2023-10-16 17:09:59


懒标记可能为负吧?我不知道。 取模是不是少了?我不知道。
by Sonnety @ 2023-10-16 17:10:08


不会不会不会不会
by Hanzelic @ 2023-10-16 17:11:18


@[Sonnety](/user/892222) 问题不止这一点
by 赛克尔だよ @ 2023-10-16 17:12:33


@[Sonnety](/user/892222) Orz谢谢您我去看看
by Vsinger_洛天依 @ 2023-10-16 17:12:40


| 下一页