首页 > 其他分享 >数据结构#1 笛卡尔树学习笔记

数据结构#1 笛卡尔树学习笔记

时间:2022-10-23 23:12:37浏览次数:64  
标签:weight 笛卡尔 ll tree 笔记 key 数据结构 top

笛卡尔树

数据结构结构介绍

  • 笛卡尔树是一种树形的数据结构,它的每一个节点都有两个值key和weight,其中key满足二叉搜索树的性质,而weight满足堆的性质。在使用时,我们通常将key值排序后放在数组中,方便建树。一个有趣的事实是,如果笛卡尔树的键值确定,且key和weight互不相同, 那么这个笛卡尔树的结构是唯一的。

​ (图片来自oiwiki,其中上面数组中的是weight,数组的下标为key)

唯一性证明

  • 我们首先将要处理的数据按照key值从小到大排序,之后对于任意的一段区间,我们知道存在一个相对应的小根堆,而小根堆的堆顶毫无疑问就是整个数组中weight的最小值。最小值将数组分成两个部分,它的左儿子就是它左边区间的最小值,右儿子就是它右边区间的最小值,之后可以递归建出整棵树。因此,这棵树是唯一的。

建树实现

  • 将元素按照key排序。然后一个一个插入到当前的笛卡尔树中。那么每次我们插入的元素必然在这个树的右链的末端。于是我们执行这样一个过程,从下往上比较右链结点与当前结点x的weight ,如果找到了一个右链上的结点i满足wi<wx ,就把i接到x的右儿子上,而i原本的右子树就变成x的左子树。以下是我的垃圾实现代码。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN=1e7+7;
ll n,root,a[MAXN];
struct tree_node
{
    ll lkid,rkid,wei,key,fa;
}tree[MAXN];

ll tree_init()
{
    for(ll i=1;i<=n;i++)
    {
        tree[i].key=i;
        tree[i].wei=a[i];
        tree[i].fa=i;
        tree[i].lkid=tree[i].rkid=0;
    }
    ll s[MAXN],top=0,rt=1,p,q;
    s[++top]=1;
    for(ll i=2;i<=n;i++)
    {
        if(tree[rt].wei>tree[i].wei)
        {
            tree[rt].fa=i;
            tree[i].lkid=rt;
            rt=i;
            s[1]=i;
            top=1;
            continue;
        }
        p=1;
        while(p<=top&&tree[s[p]].wei<tree[i].wei)p++;
        if(p>top)
        {
            tree[s[top]].rkid=i;
            tree[i].fa=s[top];
            s[++top]=i;
            continue;
        }
        q=tree[s[p]].fa;
        tree[q].rkid=i;
        tree[i].fa=q;
        tree[s[p]].fa=i;
        tree[i].lkid=s[p];
        top=p;
        s[top]=i;
    }
    return rt;
}

例题

HDU 1506 最大子矩形

洛谷 P5854 【模板】笛卡尔树

标签:weight,笛卡尔,ll,tree,笔记,key,数据结构,top
From: https://www.cnblogs.com/Ultramarines/p/16819983.html

相关文章

  • Mysql学习笔记(十三)
    mysql常用数据类型:int,double,float,decimal,varchar,char,text,datetime;表的创建:createtable[schema数据库名或者表名].tablename;数据对象的命名规则:必须以字......
  • 20201302姬正坤第五章学习笔记
    LINUX第五章定时器及时钟服务硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用......
  • sql-学习笔记
    1、union与unionall的区别:union会对查询到的数据进行去重,unionall则会保存所有查询到的结果 2、groupby1,2表示:第一列、第二列属性 3、count(1)和count(date)......
  • 信息安全系统设计与实现学习笔记8
    一、知识点归纳以及自己最有收获的内容1、知识点归纳第5章定时器及时钟服务1、硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡......
  • Linux nano编辑器使用笔记
    新安装的Debian系统,编辑文件的时候发现只有一个自带的nano编辑器,nano编辑器的命令和vi有所不同,做简单笔记。新建/编辑文件nano路径+文件名如果改文件存在,上面的命令将打开......
  • UE4学习笔记11——【蓝图】拾取钥匙开门
    P35.拾取钥匙开门P35(在“内容浏览器”中,“内容——StartContent——Architecture”中有一些关于建筑的静态网格体,比如墙)(复制一个我们之前做好的旋转开关门蓝图类,在这......
  • Ethernet—笔记本电脑突然不能联网,显示以太网网络电缆被拔出,用的是无线网
    问题如下图突然上不了网了今天突然遇到上网问题,电脑突然上不了网了,在我的不断搜索终于给我找到了办法,或许还有别的方法下面是我解决方法步骤。这一次我同样是打开设备......
  • C语言笔记基础知识
    ......
  • Redis 02: redis基础知识 + 5种数据结构 + 基础操作命令
    Redis基础知识1)、测试redis服务的性能:redis-benchmark2)、查看redis服务是否正常运行:ping如果正常---pong3)、查看redis服务器的统......
  • 根号分治简单笔记 | P3396 哈希冲突
    简要题意你需要维护一个长度为\(n\)的序列\(v\),支持:Axy求整个序列中,所有模\(x\)为\(y\)的下标的元素的值,即:\[\sum_{i=0}^{\lfloor(n-y)\divx\rfloor}v_{ix......