乘0可能会有什么影响啊

P1501 [国家集训队] Tree II

原来的写法: ```cpp inline void pushnow(int x,int add,int mul){ if(!x)return; t[x].data=(t[x].data*mul+add)%mod; t[x].add=(t[x].add*mul+add)%mod; t[x].mul=t[x].mul*mul%mod; t[x].sum=(t[x].sum*mul+t[x].size*add)%mod; } inline void pushdown(int x){ if(t[x].lazy){ t[x].lazy=false; pushlazy(lc);pushlazy(rc); } if(t[x].add||t[x].mul){ pushnow(lc,t[x].add,t[x].mul); pushnow(rc,t[x].add,t[x].mul); t[x].add=0,t[x].mul=1; } } ``` 改正后的写法: ```cpp inline void pushnowa(int x,int val){ if(val==0)return; t[x].add+=val;t[x].data+=val;t[x].sum+=t[x].size*val; t[x].add%=mod;t[x].data%=mod;t[x].sum%=mod; } inline void pushnowm(int x,int val){ if(val==1)return; t[x].add*=val;t[x].mul*=val;t[x].sum*=val;t[x].data*=val; t[x].add%=mod;t[x].mul%=mod;t[x].sum%=mod;t[x].data%=mod; } inline void pushdown(int x){ if(t[x].lazy){ t[x].lazy=false; pushlazy(lc);pushlazy(rc); } if(t[x].mul!=1){ pushnowm(lc,t[x].mul); pushnowm(rc,t[x].mul); t[x].mul=1; } if(t[x].add){ pushnowa(lc,t[x].add); pushnowa(rc,t[x].add); t[x].add=0; } } ```
by Feyn @ 2022-02-26 12:54:16


为什么就改了这么一点,把加lazy和乘lazy拆开处理之后就过了啊……
by Feyn @ 2022-02-26 12:55:03


先乘后加
by Kyo1337 @ 2022-02-26 12:58:21


@[Custlo_](/user/270532) 谢谢大佬,只不过刚才发现错误不在那里
by Feyn @ 2022-02-26 13:02:38


错误是改正前写法里pushdown函数那行 ```if(t[x].add||t[x].mul)``` 应该写作 ```if(t[x].add||t[x].mul!=1)``` 一个很低级的错误……
by Feyn @ 2022-02-26 13:04:17


此帖终结
by Feyn @ 2022-02-26 13:04:35


|