样例没过求调教 悬关

P3373 【模板】线段树 2

`tr[lc].ad*=tr[x].mul%q+tr[x].ad`等价于`tr[lc].ad=tr[lc].ad*(tr[x].mul%q+tr[x].ad)`,应该改成`tr[lc].ad=(1ll*tr[lc].ad*tr[x].mul+tr[x].ad)%q`
by Guoyh @ 2023-08-21 23:10:49


@[I_ak_iOi_2024](/user/510311) 还有你好像没开long long
by Guoyh @ 2023-08-21 23:11:28


@[I_ak_iOi_2024](/user/510311) `a*=(...)`会先把右边的表达式算出来再乘到a上,你好像理解错了
by Guoyh @ 2023-08-21 23:14:05


@[Guoyh](/user/88449) 确实是个错误 已关
by I_ak_iOi_2024 @ 2023-08-22 10:03:58


```cpp #include<bits/stdc++.h> #define lc x<<1 #define rc (x<<1)|1 #define ll long long using namespace std; ll n,m,q,a[4000010]; struct node{ ll sm,mul,ad; }tr[400010]; void update(ll x){ tr[x].sm=(tr[lc].sm+tr[rc].sm)%q; } void build(ll x,ll l,ll r){ tr[x].mul=1; if(l==r) { tr[x].sm=a[l]; return; } ll mid=l+r>>1; build(lc,l,mid);build(rc,mid+1,r); update(x); } void pushdown(ll x,ll l,ll r){ tr[lc].ad=(tr[lc].ad*tr[x].mul+tr[x].ad)%q;tr[rc].ad=(tr[rc].ad*tr[x].mul+tr[x].ad)%q; ll mid=l+r >>1; tr[lc].sm*=tr[x].mul%q;tr[rc].sm*=tr[x].mul%q; tr[lc].mul*=tr[x].mul%q;tr[rc].mul*=tr[x].mul%q; tr[lc].sm=(tr[lc].sm+(mid-l+1)*tr[x].ad)%q;tr[rc].sm=(tr[rc].sm+(r-mid)*tr[x].ad)%q; tr[x].mul=1;tr[x].ad=0; } void modifyad(int x,int l,int r,int L,int R,int d){ if(l==L&&r==R) { tr[x].sm+=(r-l+1)*d%q; tr[x].ad+=d%q; return; } int mid=l+r >>1; pushdown(x,l,r); if(R<=mid) modifyad(lc,l,mid,L,R,d); else if(L>mid) modifyad(rc,mid+1,r,L,R,d); else modifyad(lc,l,mid,L,mid,d),modifyad(rc,mid+1,r,mid+1,R,d); update(x); } void modifymul(ll x,ll l,ll r,ll L,ll R,ll d){ if(l==L&&r==R) { tr[x].ad*=d%q; tr[x].sm*=d%q; tr[x].mul*=d%q; return; } ll mid=l+r >>1; pushdown(x,l,r); if(R<=mid) modifymul(lc,l,mid,L,R,d); else if(L>mid) modifymul(rc,mid+1,r,L,R,d); else modifymul(lc,l,mid,L,mid,d),modifymul(rc,mid+1,r,mid+1,R,d); update(x); } ll query(ll x,ll l,ll r,ll L,ll R){ if(l==l&&r==R) return tr[x].sm; ll mid=l+r>>1; pushdown(x,l,r); if(R<=mid) return query(lc,l,mid,L,R); else if(L>mid) return query(rc,mid+1,r,L,R); else return query(lc,l,mid,L,mid)+query(rc,mid+1,r,mid+1,R)%q; } int main(){ //freopen(" ","r",stdin); //freopen(" ","w",stdout); cin>> n >> m>>q ; for(ll i=1;i<=n;i++)cin>>a[i]; build(1,1,n); while(m--){ ll op,x,y,k; scanf("%d%d%d",&op,&x,&y); if(op==1){ cin>> k; modifymul(1,1,n,x,y,k); } if(op==2){ cin>> k; modifyad(1,1,n,x,y,k); } if(op==3){ cout << query(1,1,n,x,y)%q<<'\n'; } } //fclose(stdin); //fclose(stdout); return 0; } ``` ~~似乎还有些问题~~
by I_ak_iOi_2024 @ 2023-08-22 10:04:30


@[I_ak_iOi_2024](/user/510311) 你把所有+=和*=都改掉
by Guoyh @ 2023-08-22 14:04:39


```cpp if(l==l&&r==R) return tr[x].sm; ``` ~~wdnmd手残服了~~
by I_ak_iOi_2024 @ 2023-08-22 15:20:36


@[Guoyh](/user/88449) 感谢感谢
by I_ak_iOi_2024 @ 2023-08-22 15:21:02


————结束线——————
by I_ak_iOi_2024 @ 2023-08-22 15:21:46


|