洛谷 P5854:【模板】笛卡尔树

ops/2024/10/18 12:34:07/

【题目来源】
https://www.luogu.com.cn/problem/P5854

【题目描述】
给定一个 1∼n 的排列 p,构建其笛卡尔树
即构建一棵二叉树,满足:
1.每个节点的编号满足二叉搜索树的性质。← 优先级 
pri 满足二叉搜索树(BST)的性质
2.节点 i 的权值为 pi,每个节点的权值满足小根堆的性质。← 键值 val 满足的性质

【输入格式】
第一行一个整数 n。
第二行一个排列 p1,…,pn。

【输出格式】
设 li,ri 分别表示节点 i 的左右儿子的编号(若不存在则为 0)。
一行两个整数,分别表示 xor_{i=1}^{n}i\times (l_i+1) 和 xor_{i=1}^{n}i\times (r_i+1)

【输入样例】
5
4 1 3 2 5

【输出样例】
19 21


【样例解释】​​​​​​​

ili​ri​
100
214
300
435
555


【数据范围】
对于 30% 的数据,n≤10^3。
对于 60% 的数据,n≤10^5。
对于 80% 的数据,n≤10^6。
对于 90% 的数据,n≤5×10^6。
对于 100% 的数据,1≤n≤10^7。

【算法分析】

(一)笛卡尔树
● 笛卡尔树是一种非常特殊的二叉搜索树(BST)。每个结点有两个信息 (pri, val),如果只考虑 pri,它是一棵二叉搜索树,如果只考虑 val,它是一个小根堆。
● 一个有趣的事实是,如果笛卡尔树的 pri 值互不相同,val 值互不相同,那么这个笛卡尔树的结构是唯一的。如来源于 
https://oi-wiki.org/ds/cartesian-tree/ 的图示如下。其中,此图中的数字是笛卡尔树的 val 值,各数字所在数组对应的下标是笛卡尔树的 pri 值。例如,在图中9对应的下标为1,3对应的下标为2,7对应的下标为3,1对应的下标为4,……,5对应的下标为11。

● 构造笛卡尔树时,若各个结点指定了 pri,则先对 pri 从小到大排列。否则,
pri 默认为数组下标。在保证 pri 递增的情况下,可以在线性时间复杂度内构造一棵笛卡尔树
● 构建笛卡尔树的过程:由于已对结点信息
 (pri, val) 中 pri 递增排序,所以依据 pri 将结点逐个插入到笛卡尔树中时,为了符合“如果只考虑 pri,它是一棵二叉搜索树”的性质,即满足“左小右大”的性质,那么每次新插入的结点 cur 必然在笛卡尔树右链的末端。(右链:即从笛卡尔树的根结点一直往右子树走,所经过的结点形成的路径。)
● 之后,从下往上比较笛卡尔树右链结点与右链末端结点 cur 的 val 值。如果找到了一个右链上的结点 x 满足 x_{val}< cur_{val},为了满足“
如果只考虑 val,它是一个小根堆”的性质,就把 cur 接到 x 的右儿子上,而 x 原本的右子树就变成 cur 的左子树。
● Treap 本质上也是一种笛卡尔树

(二)快读
● 快读:https://blog.csdn.net/hnjzsyjyj/article/details/120131534
在数据量比较大的时候,即使使用 scanf 函数读入数据也会超时,这时就需要使用“快读”函数了。“快读”函数之所以快,是因为其中的
getchar 函数要比 scanf 函数快。 网传,“快读”函数能以比 scanf 函数快5倍的速度读入任意整数

int read() { //fast readint x=0,f=1;char c=getchar();while(c<'0' || c>'9') { //!isdigit(c)if(c=='-') f=-1; //- is a minus signc=getchar();}while(c>='0' && c<='9') { //isdigit(c)x=x*10+c-'0';c=getchar();}return x*f;
}

【算法代码】

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int maxn=1e7+5;int a[maxn];
int n;
LL lson[maxn],rson[maxn];
LL ans1,ans2;stack<int> s;int read() { //fast readint x=0,f=1;char c=getchar();while(c<'0' || c>'9') { //!isdigit(c)if(c=='-') f=-1; //- is a minus signc=getchar();}while(c>='0' && c<='9') { //isdigit(c)x=x*10+c-'0';c=getchar();}return x*f;
}int main() {scanf("%d",&n);for(int i=1; i<=n; i++) {a[i]=read();while(!s.empty() && a[s.top()]>a[i]) {lson[i]=s.top();s.pop();}if(!s.empty()) rson[s.top()]=i;s.push(i);}for(int i=1; i<=n; i++) {ans1=ans1^(i*(lson[i]+1));ans2=ans2^(i*(rson[i]+1));}printf("%lld %lld",ans1,ans2);return 0;
}/*
in:
5
4 1 3 2 5out:
19 21
*/





【参考文献】
https://blog.csdn.net/Code92007/article/details/94591571
https://oi-wiki.org/ds/cartesian-tree/
https://www.luogu.com.cn/problem/solution/P5854
https://zhuanlan.zhihu.com/p/674774129
https://www.cnblogs.com/reverymoon/p/9525764.html









 


http://www.ppmy.cn/ops/27381.html

相关文章

nginx connect 异常

1.nginx反向代理 # 测试server {listen 80;server_name local.dongpeng.com;location / {# proxy_pass http://192.168.10.131:9394;proxy_pass http://127.0.0.1:9394;}} 2.出现异常 2024/05/01 17:53:41 [error] 6#6: *1 connect() failed (111: Connection refused…

openGauss学习笔记-272 openGauss性能调优-实际调优案例01-调整查询重写GUC参数rewrite_rule

文章目录 openGauss学习笔记-272 openGauss性能调优-实际调优案例01-调整查询重写GUC参数rewrite_rule272.1 目标列子查询提升参数intargetlist272.2 提升无agg的子查询uniquecheck openGauss学习笔记-272 openGauss性能调优-实际调优案例01-调整查询重写GUC参数rewrite_rule …

【PG-2】PostgreSQL存储管理器

2. PostgreSQL存储管理器 src/backend/storage (base) torrestorresの机革:~/codes/postgresql-16.2/src/backend/storage$ ls Makefile buffer file freespace ipc large_object lmgr meson.build objfiles.txt page smgr sync存储管理器—smgr 通用存储管理器 …

Ubuntu 根目录扩容

环境 物理机&#xff1a;MacBook Air M2 Sonoma 14.4.1 虚拟机&#xff1a;VMware Fusion Player 13.5.0 镜像&#xff1a;Jammy Desktop ARM64 步骤 删除所有快照&#xff0c;关闭镜像&#xff0c;在 vm 上找到该镜像的硬盘设置&#xff0c;进行扩容&#xff1b; 开启镜像&am…

【Qt之·路径获取】

系列文章目录 文章目录 前言一、使用相对路径1.1 相对路径1.2 绝对路径1.3 QDir类1.4 QFileDialog对话框 二、示例2.1 示例一 总结 前言 在进行Qt开发时&#xff0c;经常需要获取文件的路径&#xff0c;如图片、音频、配置文件等。路径的获取可以通过直接指定绝对路径或者使用相…

RuoYi-Vue-Plus (SPEL 表达式)

RuoYi-Vue-Plus 中SPEL使用 DataScopeType 枚举类中&#xff1a; /*** 部门数据权限*/DEPT("3", " #{#deptName} #{#user.deptId} ", " 1 0 "), PlusDataPermissionHandler 拦截器中定义了解析器&#xff1a; buildDataFilter 方法中根据注解的…

TCP/IP和HTTP协议

TCP/IP OSI 七层模型在提出时的出发点是基于标准化的考虑&#xff0c;而没有考虑到具体的市场需求&#xff0c;使得该模型结构复杂&#xff0c;部分功能冗余&#xff0c;因而完全实现 OSI 参考模型的系统不多。而 TCP/IP 参考模型直接面向市场需求&#xff0c;实现起来也比较…

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 1.翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff08;二进制指令&#xff09; 2.执行环境&#xff0c;它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…