笛卡尔树 学习笔记

定义

笛卡尔树是一种树,每个节点有两个权值 (xi,yi)。如果单看 xi,它是一棵二叉搜索树(BST);如果单看 yi,它是个小根堆(Heap)。
其实 Treap 就是一种笛卡尔树,只不过 yi 是随机赋值的。

构建

板子题
首先按照 (xi) 升序排序(这题不需要)。
接下来就是一个一个插入了。我们发现要插入的点全部在右链(即从根结点一直往右子树走,经过的结点形成的链)上,所以我们需要维护右链上的节点。
我们发现右链上的点最多进出一次(或者说每个点在右链中存在的是一段连续的时间),所以我们就可以用栈维护右链上的节点,复杂度为 Θ(n)

代码如下:

#include<cstdio>
#define maxn 10000039
using namespace std;
int n,p[maxn];
struct JTZ{ int ls,rs; }a[maxn];
int s[maxn],top,k; ll ansl,ansr;
int main(){
scanf("%d",&n); register int i; top=0; for(i=1;i<=n;i++) scanf("%d",&p[i]);
for(i=1;i<=n;i++){
k=top; while(top&&p[s[k]]>p[i]) k--;
if(k) a[s[k]].rs=i;
if(k<top) a[i].ls=s[k+1];
s[++k]=i; top=k;
} ansl=ansr=0;
for(i=1;i<=n;i++) ansl^=1ll*i*(a[i].ls+1),ansr^=1ll*i*(a[i].rs+1);
printf("%lld %lld",ansl,ansr);
return 0;
}
posted @   jiangtaizhe001  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示