线段树30pts球调(悬棺)

P3373 【模板】线段树 2

```cpp int query(int l,int r,int p){ if(l<=t[p].l&&t[p].r<=r)return t[p].sum%m; pushdn(p); int mid=(t[p].l+t[p].r)>>1; int res=0; if(l<=mid)res+=query(l,r,p*2)%m,res%=m; if(mid<r)res+=query(l,r,p*2+1)%m,res%=m; return res%m; } ``` 改 ```cpp int query(int l,int r,int p){ pushdn(p); if(l<=t[p].l&&t[p].r<=r)return t[p].sum%m; int mid=(t[p].l+t[p].r)>>1; int res=0; if(l<=mid)res+=query(l,r,p*2)%m,res%=m; if(mid<r)res+=query(l,r,p*2+1)%m,res%=m; return res%m; } ```
by Big_Dinosaur @ 2024-02-20 13:39:47


两个问题: - build()中初始化时乘法懒标记未初始化成1 - 模数不对 但是改完还是30pts 建议重构一遍过/youl
by docxjun @ 2024-02-20 13:40:11


@[xht_G](/user/823535) 1. 模数是要输入的,有问题。 1. `pushdn` 部分有大问题,我给你重构了。 ```cpp #include<bits/stdc++.h> #define inf 0x3f3f3f3f #define PII pair<int,int> #define DB double #define LL long long #define int long long using namespace std; int m; //int m; inline int read(long long md){ if(md==0)md=LONG_LONG_MAX; int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=(x*10%md+(ch-48)%md)%md;ch=getchar();} return x*f; } struct Node{ int sum,a,t=1; int l,r; }t[400005]; int a[100005]; void build(int l,int r,int p){ t[p].l=l,t[p].r=r; if(l==r){ t[p].sum=a[l]%m; t[p].t=1; return; } int mid=(t[p].l+t[p].r)>>1; build(l,mid,p*2),build(mid+1,r,p*2+1); t[p].sum=(t[p*2].sum%m+t[p*2+1].sum%m)%m; } void pushdn(int p){ t[p*2].sum=(t[p].t*t[p*2].sum+t[p].a*(t[p*2].r-t[p*2].l+1))%m; t[p*2+1].sum=(t[p].t*t[p*2+1].sum+t[p].a*(t[p*2+1].r-t[p*2+1].l+1))%m; t[p*2].t=(t[p*2].t*t[p].t)%m; t[p*2+1].t=(t[p*2+1].t*t[p].t)%m; t[p*2].a=(t[p*2].a*t[p].t+t[p].a)%m; t[p*2+1].a=(t[p*2+1].a*t[p].t+t[p].a)%m; t[p].a=0,t[p].t=1; } int query(int l,int r,int p){ if(l<=t[p].l&&t[p].r<=r)return t[p].sum%m; pushdn(p); int mid=(t[p].l+t[p].r)>>1; int res=0; if(l<=mid)res+=query(l,r,p*2)%m,res%=m; if(mid<r)res+=query(l,r,p*2+1)%m,res%=m; return res%m; } void update1(int l,int r,int c,int p){ if(l<=t[p].l&&t[p].r<=r){ // pushdn(p); t[p].sum+=c%m*(t[p].r-t[p].l+1)%m,t[p].sum%=m; t[p].a+=c%m,t[p].a%=m; return; } pushdn(p); int mid=(t[p].l+t[p].r)>>1; if(l<=mid)update1(l,r,c,p*2); if(mid<r)update1(l,r,c,p*2+1); t[p].sum=t[p*2].sum%m+t[p*2+1].sum%m,t[p].sum%=m; } void update2(int l,int r,int c,int p){ if(l<=t[p].l&&t[p].r<=r){ // pushdn(p); t[p].sum*=c%m,t[p].sum%=m; t[p].t*=c%m,t[p].t%=m; t[p].a*=c%m,t[p].a%=m; return; } pushdn(p); int mid=(t[p].l+t[p].r)>>1; if(l<=mid)update2(l,r,c,p*2); if(mid<r)update2(l,r,c,p*2+1); t[p].sum=t[p*2].sum%m+t[p*2+1].sum%m,t[p].sum%=m; } signed main(){ int n,q; n=read(0),q=read(0),m=read(0); for(int i=1;i<=n;i++) a[i]=read(0); build(1,n,1); while(q--){ int op=read(0); if(op==1){ int x=read(0),y=read(0),k=read(0); update2(x,y,k,1); // cout<<"-------------------------------------------\n"; // for(int i=1;i<=2*n;i++) // cout<<t[i].l<<' '<<t[i].r<<' '<<t[i].a<<' '<<t[i].t<<' '<<t[i].sum<<'\n'; // cout<<query(x,y,1)<<'\n'; // cout<<"-------------------------------------------\n"; } if(op==2){ int x=read(0),y=read(0),k=read(0); update1(x,y,k,1); // cout<<"-------------------------------------------\n"; // for(int i=1;i<=2*n;i++) // cout<<t[i].l<<' '<<t[i].r<<' '<<t[i].a<<' '<<t[i].t<<' '<<t[i].sum<<'\n'; // cout<<query(x,y,1)<<'\n'; // cout<<"-------------------------------------------\n"; } if(op==3){ int x=read(0),y=read(0); LL ans=query(x,y,1); cout<<ans<<'\n'; } } return 0; } ```
by shoot_down @ 2024-02-20 13:50:37


@[Big_Dinosaur](/user/835600) 已A,thx
by xht_G @ 2024-02-20 14:07:18


@[docxjun](/user/580135) 已A,thx
by xht_G @ 2024-02-20 14:07:35


@[shoot_down](/user/616964) 已A,thx
by xht_G @ 2024-02-20 14:07:50


此贴结
by xht_G @ 2024-02-20 14:08:18


|