一个疑问
查看原帖
一个疑问
817681
HZHDCM楼主2024/5/13 16:34

我原先是把push_down放在下面的:

void update(int p,int x,int y,int k){//k=0或k=1为区间赋值,k=2为翻转
	if(x<=t[p].l&&y>=t[p].r){
		if(k==0||k==1){
			t[p].pre=(t[p].r-t[p].l+1)*k;
			t[p].add=k;
			t[p].max[k]=t[p].lmax[k]=t[p].rmax[k]=(t[p].r-t[p].l+1);
			t[p].max[k^1]=t[p].lmax[k^1]=t[p].rmax[k^1]=0;
		}
		else if(k==2){
			t[p].rev^=1;
			t[p].pre=(t[p].r-t[p].l+1)-t[p].pre;
			swap(t[p].max[0],t[p].max[1]);
			swap(t[p].lmax[0],t[p].lmax[1]);
			swap(t[p].rmax[0],t[p].rmax[1]);
		}
		return ;
	}
        push_down(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid)update(p<<1,x,y,k);
	if(y>mid)update(p<<1|1,x,y,k);
	push_up(p);
}

但是只有20pts 但是我把push_up换到上面就A了

void update(int p,int x,int y,int k){//k=0或k=1为区间赋值,k=2为翻转
	push_down(p);
	if(x<=t[p].l&&y>=t[p].r){
		if(k==0||k==1){
			t[p].pre=(t[p].r-t[p].l+1)*k;
			t[p].add=k;
			t[p].max[k]=t[p].lmax[k]=t[p].rmax[k]=(t[p].r-t[p].l+1);
			t[p].max[k^1]=t[p].lmax[k^1]=t[p].rmax[k^1]=0;
		}
		else if(k==2){
			t[p].rev^=1;
			t[p].pre=(t[p].r-t[p].l+1)-t[p].pre;
			swap(t[p].max[0],t[p].max[1]);
			swap(t[p].lmax[0],t[p].lmax[1]);
			swap(t[p].rmax[0],t[p].rmax[1]);
		}
		return ;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid)update(p<<1,x,y,k);
	if(y>mid)update(p<<1|1,x,y,k);
	push_up(p);
}

为什么会有差别,来个dalao解释一下为什么(xiexiele)

2024/5/13 16:34
加载中...