萌新求助线段树板子
查看原帖
萌新求助线段树板子
234783
conprour楼主2021/11/7 18:55

RT,求帮看看传递懒标记的时候这么写有没有问题,操作就是区间赋值,区间清零,区间反转。

int sum[N<<2];
	int lazy[N<<2],rev[N<<2];
	void init_lazy(){memset(lazy,-1,sizeof(lazy));}
	inline void add(int k,int l,int r,int vl,int vr)
	{
		//lazy/vl:初始-1,区间覆盖1,区间清除0
		//rev/vr: 初始0,区间反转1  
		if(vl!=-1) lazy[k]=vl;
		if(vr) 
		{
			rev[k]^=1; 
			if(vl==-1) sum[k]=r-l+1-sum[k];
			else if(vl==1) sum[k]=0;
			else sum[k]=r-l+1;
		}
		else 
		{
			if(vl==-1) sum[k]=r-l+1-sum[k];
			else if(vl==1) sum[k]=r-l+1;
			else sum[k]=0;
		}
	}
	inline void pushdown(int k,int l,int r)
	{
		if(lazy[k]==-1&&!rev[k]) return;
		add(ls,l,mid,lazy[k],rev[k]);
		add(rs,mid+1,r,lazy[k],rev[k]);
		lazy[k]=-1,rev[k]=0; 
	}
2021/11/7 18:55
加载中...