zoukankan      html  css  js  c++  java
  • COGS2421 简单的Treap

    【题目描述】

    Treap是一种平衡二叉搜索树,除二叉搜索树的基本性质外,Treap还满足一个性质:

    每个节点都有一个确定的优先级,且每个节点的优先级都比它的两个儿子小(即它的优先级满足堆性质)。

    不难证明在节点的优先级都事先给定且互不相同时,对应的Treap有且仅有一个。

    现在,给定n个数和每个数对应的优先级,求出对应的以数的大小作为二叉搜索树比较依据的Treap的先序遍历结果。

    对先序遍历的定义是:先访问根节点,再访问左子树,最后访问右子树。

    【输入格式】

    第一行一个数n表示数的个数。

    第二行n个数表示每个数的大小。

    第三行n个数表示每个数对应的优先级。

    【输出格式】

    一行n个数,表示Treap的先序遍历结果(对于每个节点,输出对应的数)。

    【样例输入】

    7
    2 11 5 9 1 4 3
    2 10 1 8 4 6 5
    

    【样例输出】

    5 2 1 3 4 9 11

    【样例解释】

    对应的Treap如图所示,其中圈内的数是给出的数,圈外的数是节点的优先级。

    【数据范围】

    n<=500000。

    所有的数和优先级都互不相同且在int(C++)/longint(Pascal)范围内。

    【提示】

    为了给不想用栈模拟递归的孩纸们偷懒的机会,C++选手请在main函数的开头加入以下代码:

    int __size__=128<<20;

    char *__p__=(char*)malloc(__size__)+__size__;

    __asm__("movl %0, %%esp "::"r"(__p__));

    注意上述代码会占用你128MB的空间,请自行调整代码。

    【来源】

    HZOI 2016



    这道题就是给你每个点的优先级和数值,让你建造一颗Treap,因为Treap是唯一的,所以可以建出来,肯定会有智障(比如我)直接去打个Treap一个一个插点进去,然后就被出题人卡掉了,那么学过fhqTreap的童鞋一定知道一种O(n)建出来一颗Treap的方法,就是笛卡尔树,那么如果这道题的话,给权值拍下序,就是裸地笛卡尔树了。


    注:实验证明,不加那三行会RE。。。


    #include <bits/stdc++.h>
    #define MAXN 500005
    using namespace std;
    int n;
     
     
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-f;
        for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+(ch^48);
        return x*f;
    }
     
    struct node{
        int v,r;
        node *ch[2];
        node(int val,int fix){
            v=val;r=fix;
            ch[0]=ch[1]=NULL;
        }
    }*root;
     
    node *Stack[MAXN],*last=NULL;
     
    struct data{
        int x,r;
        bool operator < (const data &a)const{
            return x<a.x;
        }
    }a[MAXN];
     
    void build(){
        int p=0;
        for(int i=1;i<=n;i++){
            node *k=new node(a[i].x,a[i].r);last=NULL;
            while(p&&Stack[p]->r>a[i].r)last=Stack[p],Stack[p--]=NULL;
            if(p)Stack[p]->ch[1]=k;
            k->ch[0]=last;
            Stack[++p]=k;
        }
        root=Stack[1];
    }
     
    void __dfs(node *o){
        if(!o)return;
        printf("%d ",o->v);
        __dfs(o->ch[0]);
        __dfs(o->ch[1]);
    }
     
    int main(){
        int __size__=128<<20;
        char *__p__=(char*)malloc(__size__)+__size__;
        __asm__("movl %0, %%esp
    "::"r"(__p__));
        freopen("treap.in","r",stdin);
        freopen("treap.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)a[i].x=read();
        for(int i=1;i<=n;i++)a[i].r=read();
        sort(&a[1],&a[n+1]);
        build();__dfs(root);
    }


  • 相关阅读:
    新的学习计划
    Python学习搬家啦
    安装数据库软件
    oracle11g RAC之grid安装
    PG源码编译安装
    vnc图形化远程centos7.6步骤
    postgresql 日期格式
    centos配置yum源
    pg创建多个实例
    PostgreSQL配置
  • 原文地址:https://www.cnblogs.com/Cooook/p/7738511.html
Copyright © 2011-2022 走看看