30分至AC警钟长鸣
查看原帖
30分至AC警钟长鸣
926978
xiexinxin楼主2024/1/28 15:31

1.加乘懒标记,线段树的值都需要时时刻刻的取模

(不然会发现方法对了但WA,本蒟蒻就卡了近两个小时)

2.能开long long就开long long

内存足够,不用怕,但不开会卡(本蒟蒻又因为这个卡了近一小时)

3.要用双重懒标记,不然会T,而且要先乘后加(还有一些细节在下方代码中):

①当先前的乘标记遇到了后来的加标记,不需要管。

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;//下传并归零
}

本蒟蒻码风比较奇怪,不喜请勿喷(本蒟蒻太懒,看这乘加操作差不多,只用了一个函数,靠函数中的参数区分,所以参数比较乱,但码量比大多代码少,不过更难调,调了好久,呜呜呜)

2024/1/28 15:31
加载中...