忠告线段树20分的同志
查看原帖
忠告线段树20分的同志
933530
Tim0509楼主2023/3/25 16:44

注意你在更新的时候

如果已经到达了完全覆盖的区间,请先pushdown,然后修改标记

如:


void update(ll p,ll ql,ll qr,ll opt){
	ll l=tr[p].l,r=tr[p].r;
	if(l>=ql&&r<=qr){
		pushdown(p);//注意这里
        //注意这里
        //注意这里
        //注意这里
		if(opt==0){
			//赋值为0
			tr[p].ri1=tr[p].le1=tr[p].sum1=tr[p].val1=0;
			tr[p].ri0=tr[p].le0=tr[p].sum0=tr[p].val0=tr[p].len;
			tr[p].tag1=0;
			tr[p].tag2=0;
		}
		if(opt==1){
			//赋值为1 
			tr[p].ri0=tr[p].le0=tr[p].sum0=tr[p].val0=0;
			tr[p].ri1=tr[p].le1=tr[p].sum1=tr[p].val1=tr[p].len;
			tr[p].tag1=1;
			tr[p].tag2=0;
		}
		if(opt==2){
			//取反
			swap(tr[p].le0,tr[p].le1);
			swap(tr[p].ri0,tr[p].ri1);
			swap(tr[p].val0,tr[p].val1);
			swap(tr[p].sum0,tr[p].sum1);
			tr[p].tag2=!tr[p].tag2;
		}
		return;
	}
    ………………//继续递归
}
2023/3/25 16:44
加载中...