【OI赛第五场】T1树
来源:互联网 发布:初级会计职称试题软件 编辑:程序博客网 时间:2024/05/12 07:15
笛卡尔树
笛卡尔树又称笛卡儿树,在数据结构中属于二叉树的一种。
笛卡尔树结构由Vuillmin在解决范围搜索的几何数据结构问题时提出的,从数列中构造一棵笛卡尔树可以线性时间完成,需要采用基于栈的算法来找到在该数列中的所有最近小数。由此可知,笛卡尔树是一种特定的二叉树数据结构,可由数列构造,在范围最值查询、范围top k查询(range top k queries)等问题上有广泛应用。它具有堆的有序性,中序遍历可以输出原数列。
笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value。光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)的,每个节点的value都比它的子树要大。
构造笛卡尔树的过程:
使用数据结构栈,栈中保存的始终是右链,即根结点、根结点的右儿子、根结点的右儿子的右儿子……组成的链
并且栈中从栈顶到栈底key依次减小
如果按照从后到前的顺序判断一个元素是否大于A[i],则每次插入的时间复杂度为O(k+1)
k为本次插入中移除的右链元素个数。因为每个元素最多进出右链各一次,所以整个过程的时间复杂度为O(N)。
从前往后遍历A[i],
1.对于每一个A[i],从栈中找出(从栈顶往栈底遍历,或者从数组后往前遍历)第一个小于等于A[i]的元素
2.如果找到,i.parent为sta[k],同时sta[k].r=i,即i为sta[k]的右子树,
3.如果栈中存在比A[i]大的元素 这些元素肯定是出栈了,这个问题最后的代码统一表示。
同时,sta[k+1].parent=i; i.l=sta[k+1] 即sta[K+1]为i的左子树
4.最后i入栈,比i大的A[i]都自动出栈了。
例子如下。
0 1 2 3 4 5 6 7 8 9 .....key
3 2 4 5 6 8 1 9 10 7 .....A,value
stack
0 1 2 3 4 5 6 7 8 ...num
0
1 2 3 4 5
6 7 8
6 9
最后sta[0].parent=-1; 为根节点 即 6 为根节点。
这里给出的是索引从0开始的[0,n-1]
如果题目给出的是[1,n],可以减一回到[0,n-1]上。
这就是笛卡尔树的概念及建树过程。此题就可以把中序遍历1~n当成第一维权值出现的时间(满足中序遍历是1~n),把每个点的出现的时间(两个时间不要混)当做第二位权值建小根堆(因为在层次遍历出现时间越早越可能是根)。就可以O(n)建树然后遍历一遍求先序遍历了。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=300010;int s[maxn],a[maxn],b[maxn],x,n;struct tree{int fa,l,r,val;}t[maxn];inline int build(){int top=-1,k;for(int i=1;i<=n;i++){k=top;while(k>=0&&b[s[k]]>b[i])//栈中比当前元素大的都出栈 k--;if(k!=-1){//find it,栈中元素没有完全出栈,当前元素为栈顶元素的右孩子t[i].fa=s[k];t[s[k]].r=i;}if(k<top){//出栈的元素为当前元素的左孩子 t[s[k+1]].fa=i;t[i].l=s[k+1];}s[++k]=i;top=k;}t[s[0]].fa=-1;//遍历完成后的栈顶元素就是根return s[0];}inline void out(int x){if(x==-1) return ;printf("%d ",x);out(t[x].l);out(t[x].r);}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[a[i]]=i;}for(int i=1;i<=n;i++){t[i].val=b[i];}for(int i=1;i<=n;i++)t[i].l=t[i].r=-1;x=build();out(x);return 0;}
- 【OI赛第五场】T1树
- 计算客模拟赛第五场t1(送分题)
- OI赛第二场Reason For Living
- 练习赛 第五场
- OI赛第二场t1Last mile of the way
- 【OI赛第三场t2】雇佣妹抖
- 正睿OI模拟赛第二场试卷总结
- 11.7正睿OI第八场模拟赛总结
- 第五章t1
- 第五章T1
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- 蓝桥杯模拟赛第五场
- Python不能用于大型项目?人们对Python的十大误解
- 苹果终于取消对个人打赏的抽成
- 人人都看得懂的正则表达式教程
- 用 Python 3 的 async / await 做异步编程
- Java9之后没有Java10,而是Java18.3
- 【OI赛第五场】T1树
- jsonp跨域原理(简单粗暴)
- 到了一定的年龄不结婚会怎样?
- 重磅!HTC手机将成回忆了?
- iOS特效之仿Mac窗口最小化的神奇效果
- 多线程,理想和现实的差距!
- 深受Java程序员欢迎的10款Java IDE
- Python超过R,成为数据科学和机器学习的最常用语言
- 天呐!程序员小伙一觉醒来变“斗鸡眼”