30分求条

P3373 【模板】线段树 2

@[sbno333](/user/416975) - `if(l==f[t].l&&r==f[t].r)` 应该是 `if(l<=f[t].l&&r>=f[t].r)`。 - 加 `tag` 和更新区间的顺序要搞清楚。 - 你的码风太恐怖了,看不懂。
by One_JuRuo @ 2023-11-23 16:32:15


@[One_JuRuo](/user/86507) 第一个好像没必要 第二个能具体举出么?好像没问题啊啊啊。 第三个就是复制粘贴了一些模,所以长了点。
by sbno333 @ 2023-11-23 16:37:39


@[sbno333](/user/416975) 啊?我们学的线段树不是一个?你修改/查询的区间完全覆盖当前节点的区间就修改,你这个不是要当前节点的区间和修改/查询的区间完全一样才覆盖吗? 为啥不把 `pushup`、`pushdown`、`addtag` 写成函数啊,而且取模那些都可以写成一句,~~这么不想打括号吗~~ 我实在看不懂,我就把我的 `addtag` 放上来吧: ```cpp void addtag(int p,int add,int mul) { tree[p].sum=((long long)tree[p].sum*mul+(long long)(tree[p].r-tree[p].l+1)*add)%mod; tree[p].mul=((long long)tree[p].mul*mul)%mod; tree[p].add=((long long)tree[p].add*mul+add)%mod; } ```
by One_JuRuo @ 2023-11-23 16:41:10


@[sbno333](/user/416975) 好像修改/查询确实不太一样。。。
by One_JuRuo @ 2023-11-23 16:43:30


感谢,已有思路并改,已关注大佬,您 S 吊打我 $95$ pts。 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long int n,q,m; int aa[10000009]; struct st{ int l,r; int x; int b1,b2; }f[10000009]; void inite(int l,int r,int t){ f[t].x=aa[r]-aa[l-1]; f[t].l=l; f[t].r=r; f[t].b1=1; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; if(l==r){ return; } int mid; mid=l+r; mid/=2; inite(l,mid,2*t); inite(mid+1,r,2*t+1); } void qc(int t,int l,int r,int x){ if(l==f[t].l&&r==f[t].r){ f[t].b1*=x; f[t].b2*=x; f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);//原来写作(r-l+1),下面同 f[2*t].b1*=f[t].b1; f[2*t].b2*=f[t].b1; f[2*t].b2+=f[t].b2; f[2*t+1].b1*=f[t].b1; f[2*t+1].b2*=f[t].b1; f[2*t+1].b2+=f[t].b2; f[t].b1=1; f[t].b2=0; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; return; } f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1); f[2*t].b1*=f[t].b1; f[2*t].b2*=f[t].b1; f[2*t].b2+=f[t].b2; f[2*t+1].b1*=f[t].b1; f[2*t+1].b2*=f[t].b1; f[2*t+1].b2+=f[t].b2; f[t].b1=1; f[t].b2=0; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; int mid; mid=f[t].l+f[t].r; mid/=2; if(r<=mid){ qc(2*t,l,r,x); }else if(l>mid){ qc(2*t+1,l,r,x); }else{ qc(2*t,l,mid,x); qc(2*t+1,mid+1,r,x); } f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(f[2*t].r-f[2*t].l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(f[2*t+1].r-f[2*t+1].l+1)); f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; } void qj(int t,int l,int r,int x){ if(l==f[t].l&&r==f[t].r){ f[t].b2+=x; f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1); f[2*t].b1*=f[t].b1; f[2*t].b2*=f[t].b1; f[2*t].b2+=f[t].b2; f[2*t+1].b1*=f[t].b1; f[2*t+1].b2*=f[t].b1; f[2*t+1].b2+=f[t].b2; f[t].b1=1; f[t].b2=0; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; return; } f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1); f[2*t].b1*=f[t].b1; f[2*t].b2*=f[t].b1; f[2*t].b2+=f[t].b2; f[2*t+1].b1*=f[t].b1; f[2*t+1].b2*=f[t].b1; f[2*t+1].b2+=f[t].b2; f[t].b1=1; f[t].b2=0; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; int mid; mid=f[t].l+f[t].r; mid/=2; if(r<=mid){ qj(2*t,l,r,x); }else if(l>mid){ qj(2*t+1,l,r,x); }else{ qj(2*t,l,mid,x); qj(2*t+1,mid+1,r,x); } f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(f[2*t].r-f[2*t].l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(f[2*t+1].r-f[2*t+1].l+1)); f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; } int jj(int t,int l,int r){ if(l==f[t].l&&r==f[t].r){ f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1); f[2*t].b1*=f[t].b1; f[2*t].b2*=f[t].b1; f[2*t].b2+=f[t].b2; f[2*t+1].b1*=f[t].b1; f[2*t+1].b2*=f[t].b1; f[2*t+1].b2+=f[t].b2; f[t].b1=1; f[t].b2=0; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; return f[t].x; } f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1); f[2*t].b1*=f[t].b1; f[2*t].b2*=f[t].b1; f[2*t].b2+=f[t].b2; f[2*t+1].b1*=f[t].b1; f[2*t+1].b2*=f[t].b1; f[2*t+1].b2+=f[t].b2; f[t].b1=1; f[t].b2=0; f[t].x%=m; f[t].b2%=m; f[t].b1%=m; f[2*t].x%=m; f[2*t].b2%=m; f[2*t].b1%=m; f[2*t+1].x%=m; f[2*t+1].b2%=m; f[2*t+1].b1%=m; int mid; mid=f[t].l+f[t].r; mid/=2; if(r<=mid){ return jj(2*t,l,r); }else if(l>mid){ return jj(2*t+1,l,r); }else{ return jj(2*t,l,mid)+jj(2*t+1,mid+1,r); } } signed main(){ cin>>n>>q>>m; for(int i=1;i<=n;i++){ cin>>aa[i]; aa[i]+=aa[i-1]; } inite(1,n,1); for(int i=1;i<=q;i++){ int s; cin>>s; if(s==1){ int x,y,k; cin>>x>>y>>k; qc(1,x,y,k); }else if(s==2){ int x,y,k; cin>>x>>y>>k; qj(1,x,y,k); }else{ int x,y; cin>>x>>y; cout<<jj(1,x,y)%m<<endl; } /*for(int i=1;f[i].b1>0;i++){ cout<<i<<"-"<<f[i].l<<"~"<<f[i].r<<":"<<f[i].b1<<"*("<<f[i].x<<")+"<<f[i].b2<<endl; }*/ } return 0; } ```
by sbno333 @ 2023-11-23 16:51:43


|