思路来源

https://blog.csdn.net/qq_36056315/article/details/79845193(清晰易懂)

https://www.cnblogs.com/reverymoon/p/9525764.html(板子+例题)

知识总结

笛卡尔树是形如上图的一棵树,满足

①堆的性质,如本图,小根堆,两子的值大于等于父亲的值

②二叉搜索树性质,即左子树的点key(默认为下标)比根小,右子树的点key(默认为下标)比根大

显然,按中序遍历这棵树,可得原序列

③询问下标i到下标j之间(i<j)的最小值,只需寻找[i,j]的lca

笛卡尔树的构造

如果有key作第一关键字要求,要求先按照key的增序排列;否则,把key默认认为是下标

用单调栈实时维护当前树中的最右链,

即根,根的右子树,根的右子树的右子树

每次插入一个值v3的时候,在单调栈中,

不断清除大于等于v3的值,从而找到第一个小于v3的值为v1,

由于v1原右子树v2>=v3(不然第一个小于v3的值,就不是v1了),且比v3更早插入,

所以v2应该作新插入的v3的左子树,而把v3为v1的右子树

然后把v3加入栈中,保证最右链的单增性(这里维护的是小根堆)

注意没有v2的情形,即v1是叶子

注意没有v1的情形,即v3是新根

单调栈,每个元素最多进栈一次,出栈一次,O(n)完成构造

笛卡尔树,似乎会在序列单增的时候,被卡成一条链

据说,Treap也是这样的一棵树,但Treap的v是随机出来的,使树更平衡

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,v[N],fa[N],ls[N],rs[N];
int s[N],top;
void Tree()
{for(int i = 1; i <= n; i ++){scanf("%d",&v[i]);while(top && v[s[top]] > v[i])ls[i] = s[top], top --;fa[i] = s[top]; fa[ls[i]] = i; if(fa[i]) rs[fa[i]] = i;s[++ top] = i;}
}

笛卡尔树(知识总结+板子整理)相关推荐

  1. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  2. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  3. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

  4. 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数字串 s[ 0 ],每个位置的赋值初始时为 s[ i ] = i % 10 ( i ∈ [ 0 , n - 1 ] ),现在有一个长度为 n 的排 ...

  5. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  6. POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)

    题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了 ...

  7. POJ - 2201 Cartesian Tree(笛卡尔树-单调栈/暴跳父亲)

    题目链接:点击查看 题目大意:给出n个节点的key和val,构造出其笛卡尔树的原型 笛卡尔树的定义: 所谓笛卡尔树,就是将给定的n个二元组(key,val)建成一棵树.使得: 如果只关注key,那么这 ...

  8. HDU1506(天然的笛卡尔树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意:给定一个统计直方图,n个矩形条,每个矩形条宽1,高0-10^9,求最大矩形面积. 分析:天然的 ...

  9. POJ1785(笛卡尔树的构造)

    题目:http://poj.org/problem?id=1785 题意:构造笛卡尔树,这里是最大堆构造,然后以广义表的形式输出这棵笛卡尔树. #include <iostream> #i ...

  10. SGU155(笛卡尔树的构造)

    题目:http://acm.sgu.ru/problem.php?contest=0&problem=155 题意:给出每个点的两个值key和fix,且所有的key值和fix值都是不相同的,要 ...

最新文章

  1. 正则表达式和re模块知识点汇总
  2. 20个常用Linux性能监控工具/命令
  3. c语言编程输出所有水仙花数,c语言中,如何输出所有的水仙花数
  4. java调用qq接口_用java代码怎么去请求腾讯接口并返回值
  5. 服务器控件在客户端触发alert对话框后,根据情况进行回发服务器操作
  6. 卢伟冰称天玑9000调校顺利 Redmi K50系列要来了
  7. 自动驾驶——标注工具的开发笔记(legacy)
  8. boost noncopyable实现禁止类拷贝
  9. Excel的数据导入到PB的DW中
  10. sca60c使用程序_使用PHP的SDO和SCA扩展
  11. java图片透明化处理_java的图片背景透明及透明度处理
  12. 单元测试总结反思_语文期中考试总结反思
  13. Acwing-4818. 奶牛大学
  14. 表中数据的更改量保存视图
  15. 英语单词巧记(一)词缀法
  16. mysql批量删除5000条数据_mysql批量删除大量数据
  17. 【Windows】ping ip+端口
  18. SAP 查找生产订单发料成本中心 逻辑
  19. Angular4 实现多图片上传预览
  20. 让Yahoo(雅虎)1G邮箱POP的配置方法

热门文章

  1. android studio开发app设置登录界面
  2. PCI/PCIe硬件相关知识
  3. html悬浮客服代码,js QQ客服悬浮效果实现代码
  4. IPv6网络流量分析及性能监控
  5. 一文读懂物联网的关键技术有什么?
  6. mysql order by注入_sql注入之order by注入
  7. [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)
  8. 对计算机病毒的防治也,对计算机病毒及防范对策研究.doc
  9. 如何在 Android 中减小 APK 大小?
  10. php 公众号授权登录,微信公众号授权登录