两种在我看来是等价的,但 pushup 和 pushdown 取出来处理为什么才是对的?( fhq-treap )
void up(int id)
{
t[id].siz=t[t[id].ls].siz+t[t[id].rs].siz+1;
return ;
}
void pushDown(int id)
{
if(!t[id].tag) return ;
t[id].tag=0;
swap(t[id].ls,t[id].rs);
t[t[id].ls].tag^=1;
t[t[id].rs].tag^=1;
return;
}
分开push:
void split(int id,int x,int &l,int &r)
{
if(!id)
{
l=r=0;
return ;
}
if(t[t[id].ls].siz<=x)
{
pushDown(id);
l=id;
split(t[id].rs,x-t[t[id].ls].siz-1,t[id].rs,r);
up(id);
}
else
{
pushDown(id);
r=id;
split(t[id].ls,x,l,t[id].ls);
up(id);
}
return;
}
同时在外push:
void split(int id,int x,int &l,int &r)
{
if(!id)
{
l=r=0;
return ;
}
pushDown(id);
if(t[t[id].ls].siz<=x)
{
l=id;
split(t[id].rs,x-t[t[id].ls].siz-1,t[id].rs,r);
}
else
{
r=id;
split(t[id].ls,x,l,t[id].ls);
}
up(id);
return;
}