笛卡尔树
由一个键值二元组 \((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;
}
本文来自博客园,作者:流氓兔LMT,转载请注明原文链接:https://www.cnblogs.com/-include-lmt/p/18741646

浙公网安备 33010602011771号