线段树2(模板)改了半天还是70分,求助!!!

P3373 【模板】线段树 2

你把pushdown里的if判断去掉试一下
by emmoy @ 2024-02-03 11:25:29


已过,谢谢大佬
by maichong @ 2024-02-03 11:27:27


@[maichong](/user/955369) ```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 emmoy @ 2024-02-03 11:27:35


@[emmoy](/user/874990) 求教大佬为什么这里不用if判断,我也挂的这里,但是感觉没什么问题QAQ
by W_Makima @ 2024-02-19 16:14:38


@[W_Makima](/user/1189452) 哦,是不是K有可能是负数,那个tag2[x]改成tag2[x]!=1好像就过去了
by W_Makima @ 2024-02-19 16:23:24


|