(不然会发现方法对了但WA,本蒟蒻就卡了近两个小时)
内存足够,不用怕,但不开会卡(本蒟蒻又因为这个卡了近一小时)
①当先前的乘标记遇到了后来的加标记,不需要管。
if(il==l&&ir==r){//刚好重合可以标记了
add[i]+=k;//直接累加
add[i]%=q;//要取模别忘了
}
②先来的加标记遇到了后来的乘标记,加标记乘以新的乘标记,乘标记照常累加
if(il==l&&ir==r){//刚好重合可以标记了
add[i]*=k,add[i]%=q;//乘以新的乘标记,并取模
mul[i]*=k;
mul[i]%=q;//照常累积并取模
d[i]=0;
d[i]+=g[i].z*(k-1);//乘法增加的值,方便返回
g[i].z+=d[i];//当前区间的值
d[i]%=q;
g[i].z%=q;//取模,一步都不能少
return;
}
③.先乘后加
//先判断乘标记再看加标记
if(mul[i]!=1&&l!=r){//如果有乘标记,判断条件要为mul!=1,因为取余可能取到零
pr(l,mind-1,i*2,c[i],2);
pr(mind,r,i*2+1,c[i],2):
mul[i]=1;//下传并归零
}
if(add[i]!=0){//如果有加标记
pr(l,mind-1,i*2,p[i],1);
pr(mind,r,i*2+1,p[i],1);
add[i]=0;//下传并归零
}
本蒟蒻码风比较奇怪,不喜请勿喷(本蒟蒻太懒,看这乘加操作差不多,只用了一个函数,靠函数中的参数区分,所以参数比较乱,但码量比大多代码少,不过更难调,调了好久,呜呜呜)