TH911 @ 2024-12-21 15:24:09
检查你的两个标记中是否取消了另一个标记。
比如我的 pushdown()
是这样的:
void down(int p){
if(t[p].set!=-1){
t[p<<1].cnt[t[p].set]=size(p<<1);
t[p<<1].cnt[t[p].set^1]=0;
t[p<<1].len[t[p].set]=size(p<<1);
t[p<<1].len[t[p].set^1]=0;
t[p<<1].pre[t[p].set]=size(p<<1);
t[p<<1].pre[t[p].set^1]=0;
t[p<<1].suf[t[p].set]=size(p<<1);
t[p<<1].suf[t[p].set^1]=0;
t[p<<1].set=t[p].set;
t[p<<1].reverse=false;//这里!!
t[p<<1|1].cnt[t[p].set]=size(p<<1|1);
t[p<<1|1].cnt[t[p].set^1]=0;
t[p<<1|1].len[t[p].set]=size(p<<1|1);
t[p<<1|1].len[t[p].set^1]=0;
t[p<<1|1].pre[t[p].set]=size(p<<1|1);
t[p<<1|1].pre[t[p].set^1]=0;
t[p<<1|1].suf[t[p].set]=size(p<<1|1);
t[p<<1|1].suf[t[p].set^1]=0;
t[p<<1|1].set=t[p].set;
t[p<<1|1].reverse=false;//这里!!
t[p].set=-1;
}
if(t[p].reverse){
swap(t[p<<1].cnt[0],t[p<<1].cnt[1]);
swap(t[p<<1].len[0],t[p<<1].len[1]);
swap(t[p<<1].pre[0],t[p<<1].pre[1]);
swap(t[p<<1].suf[0],t[p<<1].suf[1]);
t[p<<1].reverse=!t[p<<1].reverse;
swap(t[p<<1|1].cnt[0],t[p<<1|1].cnt[1]);
swap(t[p<<1|1].len[0],t[p<<1|1].len[1]);
swap(t[p<<1|1].pre[0],t[p<<1|1].pre[1]);
swap(t[p<<1|1].suf[0],t[p<<1|1].suf[1]);
t[p<<1|1].reverse=!t[p<<1|1].reverse;
t[p].reverse=false;
}
}
先推平再翻转的话,推平后就应该取消翻转。
包括下面的比如说推平函数:
void set(int p,int l,int r,int k){
if(l<=t[p].l&&t[p].r<=r){
t[p].cnt[k]=size(p);
t[p].cnt[k^1]=0;
t[p].len[k]=size(p);
t[p].len[k^1]=0;
t[p].pre[k]=size(p);
t[p].pre[k^1]=0;
t[p].suf[k]=size(p);
t[p].suf[k^1]=0;
t[p].set=k;
t[p].reverse=false;//这!!!!!
return;
}
down(p);
if(l<=t[p<<1].r)set(p<<1,l,r,k);
if(t[p<<1|1].l<=r)set(p<<1|1,l,r,k);
up(p);
}
总而言之就是这俩标记会互相影响,然后就会使你 WA 掉。
就这三行卡了我将近 3 个小时。。。
by one_of_the_person @ 2024-12-21 15:39:57
@TH911 %%%