问一个奇怪的问题
  • 板块学术版
  • 楼主wh__
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/5 21:00
  • 上次更新2024/8/5 21:10:46
查看原帖
问一个奇怪的问题
544279
wh__楼主2024/8/5 21:00

两种在我看来是等价的,但 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;
}
2024/8/5 21:00
加载中...