求助(改了一天了)(30分)

P3373 【模板】线段树 2

求dalao帮助
by 无名ZWH @ 2020-05-31 20:04:25


不在60分以上的看不到代码,把它贴出来吧
by 天命之路 @ 2020-05-31 20:09:00


@[无名ZWH](/user/226142) 怎么又是您/fad 您的乘法标记为什么是清空后是 0 啊
by Limit @ 2020-05-31 20:09:13


?(
by 嫐嬲巭孬 @ 2020-05-31 20:09:13


看不到代码.jpg
by WOWHandsome @ 2020-05-31 20:11:00


```cpp #include<bits/stdc++.h> using namespace std; long long a[1000500],tr[1000500],ans[1000500],b[1000500],he[1000050],lazy[1000500],busy[1000050]; long long mid,n,m,ji=0,sum=0,pop; void build(long long k,long long l,long long r) { if(l==r){ tr[k]=a[l]; tr[k]=tr[k]%pop; return ; } long long mid=(r-l)/2+l; build(k*2,l,mid); build(k*2+1,mid+1,r); tr[k]=tr[k*2+1]+tr[k*2]; tr[k]=tr[k]%pop; } void push(int k,int l,int r) { if(busy[k]!=0){ tr[k]*=busy[k]; tr[k]=tr[k]%pop; if (busy[k*2]==0){ busy[k*2]=busy[k]; busy[k*2]=busy[k*2]%pop; lazy[k*2]*=busy[k]; lazy[k*2]=lazy[k*2]%pop; he[k*2]*=busy[k]; he[k*2]=he[k*2]%pop; } else{ busy[k*2]*=busy[k]; busy[k*2]=busy[k*2]%pop; lazy[k*2]*=busy[k]; lazy[k*2]=lazy[k*2]%pop; he[k*2]*=busy[k]; he[k*2]=he[k*2]%pop; } if (busy[k*2+1]==0){ busy[k*2+1]=busy[k]; busy[k*2+1]=busy[k*2+1]%pop; lazy[k*2+1]*=busy[k]; lazy[k*2+1]=lazy[k*2+1]%pop; he[k*2+1]*=busy[k]; he[k*2+1]=he[k*2+1]%pop; } else{ busy[k*2+1]*=busy[k]; busy[k*2+1]=busy[k*2+1]%pop; lazy[k*2+1]*=busy[k]; lazy[k*2+1]=lazy[k*2+1]%pop; he[k*2+1]*=busy[k]; he[k*2+1]=he[k*2+1]%pop; } busy[k]=0; } if(lazy[k]!=0){ lazy[k*2]+=lazy[k]; lazy[k*2+1]+=lazy[k]; lazy[k*2+1]=lazy[k*2+1]%pop; lazy[k*2]=lazy[k*2]%pop; tr[k]+=(r-l+1)*lazy[k]; tr[k]=tr[k]%pop; lazy[k]=0; } return ; } void check(long long x,long long y) { for(;x!=1;){ he[x/2]+=y; he[x/2]=he[x/2]%pop; x=x/2; } } void change(long long k,long long l,long long r,long long cha1,long long cha2,long long jia)//cha1?a2¡§|?¡§¡ã?????¨¢¡§???|¨¬??¨º?cha2?a¡§?¡§¡ã??|¨¬??¨º?l?a?¨¢¡§??????¨º?r?a¡§?¡§¡ã?????¨º?jia?a2¡§¡ä?¨¢?? { if(l==cha1&&r==cha2) { if(busy[k]==0){ check(k,tr[k]*(jia-1)+lazy[k]*(jia-1)+he[k]*(jia-1)); busy[k]+=jia; busy[k]=busy[k]%pop; } else { check(k,tr[k]*(jia-1)*busy[k]+lazy[k]*(jia-1)+he[k]*(jia-1)); busy[k]*=jia; busy[k]=busy[k]%pop; } he[k]*=jia; he[k]=he[k]%pop; lazy[k]=lazy[k]*jia; lazy[k]=lazy[k]%pop; return ; } push(k,l,r); if(l<=cha1&&r>=cha2){ long long mid=(r-l)/2+l; if(mid>=cha2) change(k*2,l,mid,cha1,cha2,jia); if(mid+1<=cha1) change(k*2+1,mid+1,r,cha1,cha2,jia); if(mid<cha2&&cha1<mid+1) { change(k*2,l,mid,cha1,mid,jia); change(k*2+1,mid+1,r,mid+1,cha2,jia); } } } //------------------------------------------------------------------- void gai(long long k,long long l,long long r,long long cha1,long long cha2,long long jia)//cha1?a2¡§|?¡§¡ã?????¨¢¡§???|¨¬??¨º?cha2?a¡§?¡§¡ã??|¨¬??¨º?l?a?¨¢¡§??????¨º?r?a¡§?¡§¡ã?????¨º?jia?a2¡§¡ä?¨¢?? { if(l==cha1&&r==cha2){ check(k,(cha2-cha1+1)*jia); lazy[k]+=jia; lazy[k]=lazy[k]%pop; return ; } push(k,l,r); if(l<=cha1&&r>=cha2){ long long mid=(r-l)/2+l; if(mid>=cha2) gai(k*2,l,mid,cha1,cha2,jia); if(mid+1<=cha1) gai(k*2+1,mid+1,r,cha1,cha2,jia); if(mid<cha2&&cha1<mid+1) { gai(k*2,l,mid,cha1,mid,jia); gai(k*2+1,mid+1,r,mid+1,cha2,jia); } } } //------------------------------------------------------------------- void yong(long long k,long long l,long long r,long long cha1,long long cha2) //cha1?a2¡§|?¡§¡ã?????¨¢¡§???|¨¬??¨º?cha2?a¡§?¡§¡ã??|¨¬??¨º?l?a?¨¢¡§??????¨º?r?a¡§?¡§¡ã???? { if(l==cha1&&r==cha2){ sum=sum+tr[k]+(r-l+1)*lazy[k]+he[k]; if(busy[k]!=0){ sum+=(busy[k]-1)*tr[k]; } sum=sum%pop; return ; } if(l<=cha1&&r>=cha2){ push(k,l,r); long long mid=(r-l)/2+l; if(mid>=cha2) yong(k*2,l,mid,cha1,cha2); if(mid+1<=cha1) yong(k*2+1,mid+1,r,cha1,cha2); if(mid<cha2&&cha1<mid+1) { yong(k*2,l,mid,cha1,mid); yong(k*2+1,mid+1,r,mid+1,cha2); } } } int main() { //freopen("1.in","r",stdin); scanf("%lld%lld%lld",&n,&m,&pop); for(long long i=1;i<=n;i++){ scanf("%lld",&a[i]); } build(1,1,n); long long pan,l1,l2,c; for(long long i=1;i<=m;i++){ scanf("%lld",&pan); if(pan==1){ scanf("%lld%lld%lld",&l1,&l2,&c); change(1,1,n,l1,l2,c); } if(pan==2){ scanf("%lld%lld%lld",&l1,&l2,&c); gai(1,1,n,l1,l2,c); } if(pan==3){ ji++; scanf("%lld%lld",&l1,&l2); sum=0; yong(1,1,n,l1,l2); ans[ji]=sum; sum=0; } } for(long long i=1;i<=ji;i++){ printf("%lld\n",ans[i]); } return 0; } ```
by 无名ZWH @ 2020-05-31 20:11:31


@[Limit](/user/86625) 调不动QWQ
by 无名ZWH @ 2020-05-31 20:11:52


@[无名ZWH](/user/226142) 标记用得有点乱~~怪不得这么长~~
by Limit @ 2020-05-31 20:12:18


@[Limit](/user/86625) 这样应该是可以的吧,毕竟乘法标记为0有特判
by 无名ZWH @ 2020-05-31 20:13:21


@[Limit](/user/86625) 十分离谱QWQ
by 无名ZWH @ 2020-05-31 20:14:16


| 下一页