- 很可能是我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