非旋转treap 模板

来源:互联网 发布:excel2013解密软件 编辑:程序博客网 时间:2024/06/14 05:23
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<ctime>#include<cstdlib>#include<utility>using namespace std;typedef long long ll;typedef pair<int,int> pii;struct node{    int ls,rs;    int k,v,s;    node()    {        ls=rs=k=v=s=0;    }};node a[1000010];int cnt;int nownode(int v){    cnt++;    a[cnt].s=1;    a[cnt].v=v;    a[cnt].k=rand()*100+rand();    return cnt;}int st[100010];int top;int c[100010];int build(int n){    top=0;    int i;    for(i=1;i<=n;i++)    {        int x=nownode(c[i]);        while(top&&a[st[top]].k>a[x].k)        {            a[x].ls=st[top];            top--;        }        if(top)            a[st[top]].rs=x;        st[++top]=x;    }    return st[1];}pii split(int p,int v){    if(!p)        return pii();    pii s;    if(a[p].v<=v)    {        s=split(a[p].rs,v);        a[p].rs=s.first;        s.first=p;        return s;    }    else    {        s=split(a[p].ls,v);        a[p].ls=s.second;        s.second=p;        return s;    }}int merge(int p1,int p2){    if(!p1)        return p2;    if(!p2)        return p1;    if(a[p1].k<a[p2].k)    {        a[p1].rs=merge(a[p1].rs,p2);        return p1;    }    else    {        a[p2].ls=merge(p1,a[p2].ls);        return p2;    }    return 0;}void dfs(int x){    if(a[x].ls)        dfs(a[x].ls);    printf("%d ",a[x].v);    if(a[x].rs)        dfs(a[x].rs);}int main(){    srand(time(0));    int n;    scanf("%d",&n);    int i;    for(i=1;i<=n;i++)        scanf("%d",&c[i]);    cnt=0;    int rt=build(n);    dfs(rt);}
原创粉丝点击