线段树2模版求助QwQ

P3373 【模板】线段树 2

- 很可能是我push_down或MUT(乘法)出错了?QwQ
by 反手一只MJJ @ 2020-11-06 21:26:37


~~看到可爱的粉色我就来了(才不是因为这个原因才回帖的呢!~~ 过了4天了不知道有没有解决掉不过还是说一下吧qwq push_down写的有点乱&逻辑有点点小错w ``` void push_down(ll l,ll r,ll rt){ ll mid=(l+r)>>1; sum[rt<<1]=(sum[rt<<1]*mut[rt]+add[rt]*(mid-l+1))%p; sum[rt<<1|1]=(sum[rt<<1|1]*mut[rt]+add[rt]*(r-mid))%p; add[rt<<1]=(add[rt<<1]*mut[rt]+add[rt])%p; add[rt<<1|1]=(add[rt<<1|1]*mut[rt]+add[rt])%p; mut[rt<<1] = (mut[rt<<1]*mut[rt]) % p; mut[rt<<1|1] = (mut[rt<<1|1]*mut[rt])%p; add[rt]=0, mut[rt] = 1; return; } ``` 改了下push_down~ 具体就是下放标记的时候没有把儿子的add标记乘上父节点的mut标记w 然后就是写的比较乱(不过也不是问题啦~ 再就是一个小问题,求sum、打add和mut标记的时候遇到完全不重合的区间可以马上退出的0.0 应该对结果还是有点影响的w ``` void ADD(ll L,ll R,ll l,ll r,ll rt,ll k){ if(l > R || r < l) return; if(L<=l&&r<=R){ add[rt]=(add[rt]+k)%p; sum[rt]=(sum[rt]+(r-l+1)*k)%p; return; } ll mid=(r+l)>>1; push_down(l,r,rt); if(L<=mid)ADD(L,R,l,mid,rt<<1,k); if(mid+1<=R)ADD(L,R,mid+1,r,rt<<1|1,k); sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%p; return; } ``` 这是在你的add基础上加了一句话 ``` if(l > R || r < l) return; ``` (点开主页发现是MC同好w~
by Toeing @ 2020-11-10 17:54:26


|