线段树30分

P3373 【模板】线段树 2

@ ruanshaochuan______. push_down 函数里下传 $mulltag[p]$ 有问题:下传条件是 $mulltag[p]!=1$ 而不是 $mulltag[p]!=0$,因为 $1$ 才表示没做更改 ```cpp #include<bits/stdc++.h> #define ls(p) p<<1 #define rs(p) p<<1|1 #define int long long using namespace std; const int N=1e5+5; int n,m,tree[N*4],adddtag[N*4],a[N],mulltag[N*4],mod; void push_up(int p) { tree[p]=(tree[ls(p)]%mod+tree[rs(p)]%mod)%mod; } void build(int p,int pl,int pr) { mulltag[p]=1; if(pl==pr) { tree[p]=a[pl]; tree[p]%=mod; return; } int mid=(pl+pr)>>1; build(ls(p),pl,mid); build(rs(p),mid+1,pr); push_up(p); } void addtag(int p,int pl,int pr,int d) { adddtag[p]+=d; adddtag[p]%=mod; tree[p]+=d*(pr-pl+1); tree[p]%=mod; } void multag(int p,int pl,int pr,int d) { adddtag[p]*=d; adddtag[p]%=mod; mulltag[p]*=d; mulltag[p]%=mod; tree[p]*=d; tree[p]%=mod; } void push_down(int p,int pl,int pr) { if(mulltag[p]!=1) { int mid=(pl+pr)>>1; multag(ls(p),pl,mid,mulltag[p]); multag(rs(p),mid+1,pr,mulltag[p]); mulltag[p]=1; } if(adddtag[p]) { int mid=(pl+pr)>>1; addtag(ls(p),pl,mid,adddtag[p]); addtag(rs(p),mid+1,pr,adddtag[p]); adddtag[p]=0; } } void upadddata(int l,int r,int p,int pl,int pr,int d) { if(l<=pl&&pr<=r) { addtag(p,pl,pr,d); return; } push_down(p,pl,pr); int mid=(pl+pr)>>1; if(l<=mid) upadddata(l,r,ls(p),pl,mid,d); if(r>mid) upadddata(l,r,rs(p),mid+1,pr,d); push_up(p); } void upmuldata(int l,int r,int p,int pl,int pr,int d) { if(l<=pl&&pr<=r) { multag(p,pl,pr,d); return; } push_down(p,pl,pr); int mid=(pl+pr)>>1; if(l<=mid) upmuldata(l,r,ls(p),pl,mid,d); if(r>mid) upmuldata(l,r,rs(p),mid+1,pr,d); push_up(p); } int query(int l,int r,int p,int pl,int pr) { if(l<=pl&&pr<=r) { return tree[p]; } push_down(p,pl,pr); int mid=(pl+pr)>>1; int sum=0; if(l<=mid) sum+=query(l,r,ls(p),pl,mid); if(r>mid) sum+=query(l,r,rs(p),mid+1,pr); return sum; } signed main() { cin>>n>>m>>mod; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]%=mod; } build(1,1,n); while(m--) { int op,l,r,d; cin>>op; if(op==1) { cin>>l>>r>>d; upmuldata(l,r,1,1,n,d); } if(op==2) { cin>>l>>r>>d; upadddata(l,r,1,1,n,d); } if(op==3) { cin>>l>>r; cout<<query(l,r,1,1,n)%mod<<endl; } } } ```
by wujingfey @ 2023-10-05 14:24:33


|