笛卡尔树

由一个键值二元组 \((k,w)\) 构成。要求 \(k\)满足二叉搜索树的性质,而\(w\) 满足堆的性质。
Treap 是笛卡尔树的一种,Treap 的 \(k\) 是随机的
始终维护右链。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int a[N];
int sta[N], top;
int n;
int rs[N], ls[N]; // 节点x的右,左儿子
int main()
{
    /*...*/
    for (int i = 1; i <= n; i++)
    {
        int k = top;
        while (k > 0 && a[sta[k]] > a[i])   //弹栈
            k--;
        if (k)
            rs[sta[k]] = i;
        if (k < top)    //有变动
            ls[i] = sta[k + 1];
        sta[++k] = i;
        k = top;
    }
    return 0;
}
posted @ 2025-02-27 18:18  流氓兔LMT  阅读(14)  评论(0)    收藏  举报