这里是一颗hsao的线段树,求调%

P3373 【模板】线段树 2

@[water_monster](/user/788202) $update$函数里面的 ```cpp if(flag) ``` 改成 ```cpp if(!flag) ``` 然后注意随时记得取模,然后就$AC$啦!
by MrcFrst_LRY @ 2023-07-19 11:37:08


@[water_monster](/user/788202) 还是贴个代码吧( 注释的地方就是我改动的地方( ```cpp #include<bits/stdc++.h> using namespace std; #define ll long long const ll M=1e5+1; ll n,q,mod,x,y,k,num; ll a[M]; struct tree{ ll date,l,r; ll ts,tm; }t[M<<2]; ll ls(ll p){ return p<<1; } ll rs(ll p){ return p<<1|1; } void push_up(ll p){ t[p].date=t[ls(p)].date+t[rs(p)].date; t[p].date%=mod;//mod } void addt(ll p,ll add,ll mul){ t[p].date=t[p].date*mul%mod+(t[p].r-t[p].l+1)*add%mod; t[p].date%=mod;//mod t[p].tm*=mul%mod; t[p].tm%=mod;//mod t[p].ts=t[p].ts%mod*mul%mod+add%mod; t[p].ts%=mod;//mod } void push_down(ll p){ addt(ls(p),t[p].ts,t[p].tm); addt(rs(p),t[p].ts,t[p].tm); t[p].ts=0,t[p].tm=1; } void build(ll p,ll l,ll r){ t[p].l=l,t[p].r=r,t[p].tm=1; if(l==r){ t[p].date=a[l]%mod;//mod return; } ll mid=(l+r)>>1; build(ls(p),l,mid); build(rs(p),mid+1,r); push_up(p); } void update(ll p,ll l,ll r,ll w,ll flag){ if(t[p].l>=l&&t[p].r<=r){ if(!flag){//flag -> !flag addt(p,w,1); return; }else{ addt(p,0,w); return; } } if(t[p].l!=t[p].r) push_down(p); ll mid=(t[p].l+t[p].r)>>1; if(l<=mid) update(ls(p),l,r,w,flag); if(mid<r) update(rs(p),l,r,w,flag); push_up(p); } ll query(ll p,ll l,ll r){ if(l<=t[p].l&&t[p].r<=r){ return t[p].date%mod; } push_down(p); push_up(p); ll mid=(t[p].l+t[p].r)>>1; ll sum=0; if(l<=mid) sum+=query(ls(p),l,r),sum%=mod; if(mid<r) sum+=query(rs(p),l,r),sum%=mod; return sum; } int main(){ scanf("%lld%lld%lld",&n,&q,&mod); for(ll i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); for(ll i=1;i<=q;i++){ scanf("%lld%lld%lld",&num,&x,&y); if(num==1){ scanf("%lld",&k); update(1,x,y,k,1); }else if(num==2){ scanf("%lld",&k); update(1,x,y,k,0); }else{ ll ans=query(1,x,y)%mod; printf("%lld\n",ans); } } return 0; } ```
by MrcFrst_LRY @ 2023-07-19 11:48:50


@[lry_star](/user/600671) !!!谢谢大佬,刚刚WA了7个点还在疑惑orz谢谢谢谢
by water_monster @ 2023-07-19 11:53:48


@[water_monster](/user/788202) 哦对刚看见您的数组开的是 $M=1e5+1$,感觉有点危险,建议您以后数组至少多开5到10,避免RE。
by MrcFrst_LRY @ 2023-07-19 11:57:58


|