treap打包求助!
  • 板块学术版
  • 楼主ybyyyf
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/22 14:45
  • 上次更新2023/11/3 08:15:51
查看原帖
treap打包求助!
821257
ybyyyf楼主2023/7/22 14:45
class Treap
{
public:

    ///inline void Treap_insert(int);
    ///inline void Treap_delete(int);
    ///inline void Treap_find_data(int);
    ///inline void Treap_find_id(int);
    ///inline void Treap_find_pre(int);
    ///inline void Treap_find_next(int);

    inline void Treap_insert(int ins_data)
    {
        treap_insert(root,ins_data);
    }

    inline void Treap_delete(int del_data)
    {
        treap_delete(root,del_data);
    }

    inline int Treap_find_data(int pos_data)
    {
        return treap_find_data(root,pos_data);
    }

    inline int Treap_find_id(int pos_id)
    {
        return treap_find_id(root,pos_id);
    }

    inline int Treap_find_pre(int pos_xx)
    {
        return treap_find_pre(root,pos_xx);
    }

    inline int Treap_find_next(int pos_xx)
    {
        return treap_find_next(root,pos_xx);
    }

private:

    struct STU{int r,siz,pri,data,l;};
    vector<STU>treap;
    int root,tot;

    ///inline void treap_updata(int);
    ///inline int treap_add(int);
    ///inline void treap_split(int,int,int,int);
    ///inline void treap_merge(int,int,int);
    ///inline void treap_insert(int,int);
    ///inline void treap_delete(int,int);
    ///inline int treap_find_data(int,int);
    ///inline int treap_find_id(int,int);


    inline void treap_updata(int x_now)
    {
        treap[x_now].siz=treap[treap[x_now].l].siz+treap[treap[x_now].r].siz+1;
    }

    inline int treap_add(int data)
    {
        if(tot==0)treap.push_back((STU){0,0,0,0,0});
        treap.push_back((STU){0,1,rand(),data,0});
	    return ++tot;
    }

    inline void treap_split(int x_now,int &x_left,int &x_right,int data)
    {
	    if(x_now==0){x_left=x_right=0;return;}
	    if(treap[x_now].data<=data)
	    {
	        x_left=x_now;
	        treap_split(treap[x_now].r,treap[x_now].r,x_right,data);
	    }
	    else
        {
		    x_right=x_now;
		    treap_split(treap[x_now].l,x_left,treap[x_now].l,data);
	    }
	    treap_updata(x_now);
    }

    inline void treap_merge(int &x_now,int x_left,int x_right)
    {
	    if(!x_left||!x_right){x_now=x_left+x_right;return;}
	    if(treap[x_left].pri<treap[x_right].pri)
        {
		    x_now=x_left;
		    treap_merge(treap[x_left].r,treap[x_left].r,x_right);
	    }
	    else
        {
            x_now=x_right;
		    treap_merge(treap[x_right].l,x_left,treap[x_right].l);
	    }
	    treap_updata(x_now);
    }

    inline void treap_insert(int &x_now,int data)
    {
    	int x_left=0,x_right=0,x_ins=treap_add(data);
	    treap_split(x_now,x_left,x_right,data);
	    treap_merge(x_left,x_left,x_ins);
	    treap_merge(x_now,x_left,x_right);
    }

    inline void treap_delete(int &x_now,int data)
    {
    	int x_left=0,x_right=0,x_del=0;
	    treap_split(x_now,x_left,x_right,data);
	    treap_split(x_left,x_left,x_del,data-1);
	    treap_merge(x_del,treap[x_del].l,treap[x_del].r);
	    treap_merge(x_left,x_left,x_del);
        treap_merge(x_now,x_left,x_right);
    }

    inline int treap_find_data(int x_now,int data)
    {
        while(treap[treap[x_now].l].siz+1!=data)
            if(treap[treap[x_now].l].siz>=data)x_now=treap[x_now].l;
            else data-=treap[treap[x_now].l].siz+1,x_now=treap[x_now].r;
        return treap[x_now].data;
    }

    inline int treap_find_id(int &x_now,int data)
    {
        int x_left=0,x_right=0,x_pos=0;
        treap_split(x_now,x_left,x_right,data-1);
        x_pos=treap[x_left].siz+1;
        treap_merge(x_now,x_left,x_right);
        return x_pos;
    }

    inline int treap_find_pre(int &x_now,int data)
    {
        int x_left=0,x_right=0,x_data=0;
        treap_split(x_now,x_left,x_right,data-1);
        if(treap[x_left].siz==0)x_data=INT_MIN;
        else x_data=treap_find_data(x_left,treap[x_left].siz);
        treap_merge(x_now,x_left,x_right);
        return x_data;
    }

    inline int treap_find_next(int &x_now,int data)
    {
        int x_left=0,x_right=0,x_data=0;
        treap_split(x_now,x_left,x_right,data);
        if(treap[x_right].siz==0)x_data=INT_MAX;
        else x_data=treap_find_data(x_right,1);
        treap_merge(x_now,x_left,x_right);
        return x_data;
    }

};

怎么像sort一样传入一个cmp?怎么把treap的元素换成外部自定义的struct?蒟蒻求助DALAO

2023/7/22 14:45
加载中...