蒟蒻70pts,RE#2#9#10求助

P3373 【模板】线段树 2

给个代码 ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN=4e5+10; long long tree[MAXN],a[MAXN],tag[MAXN],tag2[MAXN],n,m,p; void push_up(int x){ tree[x]=(tree[x*2]+tree[x*2+1])%p; return; } void push_down(long long x,long long xl,long long xr){ long long mid=(xl+xr)/2; tree[x*2]=(tree[x*2]*tag2[x])%p; tree[x*2]=(tree[x*2]+(mid-xl+1)*tag[x])%p; tag[x*2]=(tag[x*2]*tag2[x]+tag[x])%p; tag2[x*2]=(tag2[x*2]*tag2[x])%p; tree[x*2+1]=(tree[x*2+1]*tag2[x])%p; tree[x*2+1]=(tree[x*2+1]+(xr-mid)*tag[x])%p; tag[x*2+1]=(tag[x*2+1]*tag2[x]+tag[x])%p; tag2[x*2+1]=(tag2[x*2+1]*tag2[x])%p; tag[x]=0; tag2[x]=1; return; } void build(long long x,long long xl,long long xr){ tag2[x]=1; if(xl==xr){ tree[x]=a[xl]%p; return; } int mid=(xl+xr)>>1; build(x*2,xl,mid); build(x*2+1,mid+1,xr); push_up(x); return; } long long sumlr(long long x,long long xl,long long xr,long long L,long long R){ if(L<=xl&&R>=xr)return tree[x]%p; long long s=0; push_down(x,xl,xr); long long mid=(xl+xr)>>1; if(L<=mid)s=(s+sumlr(x*2,xl,mid,L,R))%p; if(R>mid)s=(s+sumlr(x*2+1,mid+1,xr,L,R))%p; return s; } void changelr(long long x,long long xl,long long xr,long long L,long long R,long long k){ if(L<=xl&&R>=xr){ tag[x]=(tag[x]+k)%p; tree[x]=(tree[x]+(xr-xl+1)*k)%p; return; } push_down(x,xl,xr); long long mid=(xl+xr)>>1; if(L<=mid)changelr(x*2,xl,mid,L,R,k); if(R>mid)changelr(x*2+1,mid+1,xr,L,R,k); push_up(x); return; } void chenglr(long long x,long long xl,long long xr,long long L,long long R,long long k){ if(L<=xl&&R>=xr){ tag2[x]=(tag2[x]*k)%p; tag[x]=(tag[x]*k)%p; tree[x]=(tree[x]*k)%p; return; } push_down(x,xl,xr); long long mid=(xl+xr)/2; if(L<=mid)chenglr(x*2,xl,mid,L,R,k); if(R>mid)chenglr(x*2+1,mid+1,xr,L,R,k); push_up(x); return; } int main(){ cin>>n>>m>>p; for(int i=1;i<=n;i++)scanf("%lld",&a[i]); build(1,1,n); for(int i=1;i<=m;i++){ long long opt,l,r,k; scanf("%lld%lld%lld",&opt,&l,&r); if(opt==1){ scanf("%lld",&k); chenglr(1,1,n,l,r,k); }else if(opt==2){ scanf("%lld",&k); changelr(1,1,n,l,r,k); }else printf("%lld\n",sumlr(1,1,n,l,r)%p); } return 0; } ````````
by HEROBRINEH @ 2024-03-03 20:49:52


@[_luo_gu](/user/950927) 我没仔细看,不过数据好像可能是负数(只是可能),用 ull 会炸吧。
by Running_a_way @ 2024-03-03 20:57:36


好吧改了并没有什么用(
by Running_a_way @ 2024-03-03 20:58:35


感谢各位大佬,因为没有判断所以叶子节点会继续下传。数组开小了,开大了10倍就AC了。 @[Running_a_way](/user/693428) @[HEROBRINEH](/user/1113507)
by _luo_gu @ 2024-03-03 20:59:37


|