题解 P5854 【【模板】笛卡尔树】
StudyingFather · · 题解
UPD(2025/08/07):修复了评论区中提到的问题,感谢评论区各位同学指正!
笛卡尔树是一种非常特殊的二叉搜索树。每个节点有两个信息
(根据上面的定义,Treap 本质上也是一种笛卡尔树)
在保证
每次插入一个新节点时,为了确保二叉搜索树的性质得到满足(别忘了我们按照
更具体地来说,我们需要维护一个从根节点一直走右儿子形成的链。我们设当前要插入的点为
维护这样一条链可以用栈实现。因为每个节点最多进栈出栈各一次,总时间复杂度是
void build()
{
int top=0,cur=0;
for(int i=1;i<=n;i++)
{
cur=top;
while(cur&&p[sta[cur]]>p[i])
cur--;
if(cur)
rs[sta[cur]]=i;
if(cur<top)
ls[i]=sta[cur+1];
sta[++cur]=i;
top=cur;
}
}