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);
    }


  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/Cooook/p/7738511.html
Copyright © 2011-2022 走看看