首页 > 其他分享 >笛卡尔树学习笔记

笛卡尔树学习笔记

时间:2024-02-23 11:34:31浏览次数:23  
标签:10000007 右链 笛卡尔 ll rs 笔记 学习 节点

1.定义

笛卡尔树是一种特殊的二叉树,同时满足小根堆和二叉搜索树的性质,笛卡尔树的每个节点有两个值(k,w),k满足二叉搜索树性质,w满足小根堆性质。Treap也是一种笛卡尔树

2.性质

  1. 如果k,w是分别两两不同的,那么笛卡尔树也是唯一的

  2. 对于一颗笛卡尔树,它的中序遍历是原序列a

  3. 在原序列中的区间[l,r]的最小值,是l,r的最近公共祖先

3.建树

3.1.栈构建

先将元素按键值k排序,再依次插入笛卡尔树中,那么每次我们插入的元素必然在这个树的右链(右链:即从根结点一直往右子树走,经过的结点形成的链)的末端,然后从下往上比较右链节点x与当前节点u的w,若找到某个节点满足\(u_w>x_w\),则把u接到x的右儿子上,而x原本的右子树就变成u的左子树

显然,每个点最多进出右链1次,所以可用栈维护,时间复杂度O(n)

3.2.代码

例题:【模板】笛卡尔树

https://www.luogu.com.cn/problem/P5854

#include<cstdio>
#define ll long long
using namespace std;
int n,a[10000007],s[10000007],ls[10000007],rs[10000007],top;
ll ans1,ans2;
void build()
{
	for(int i=1;i<=n;i++)
	{
		int k=top;
		while(k&&a[s[k]]>a[i]) k--;
	//	printf("%d %d\n",top,k);
		if(k) rs[s[k]]=i;
		if(k<top) ls[i]=s[k+1];
		s[++k]=i;
		top=k;
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build();
	for(int i=1;i<=n;i++)
	{
		ll x=1ll*i*(ls[i]+1),y=1ll*i*(rs[i]+1);
		ans1^=x,ans2^=y;
	//	printf("%d %d\n",ls[i],rs[i]);
	}
	printf("%lld %lld",ans1,ans2);
	return 0;
}

标签:10000007,右链,笛卡尔,ll,rs,笔记,学习,节点
From: https://www.cnblogs.com/wangsiqi2010916/p/18029159

相关文章

  • Syscall笔记
    本文首发:https://xz.aliyun.com/t/13687基础知识我们知道,系统核心态指的是R0,用户态指的是R3,系统代码在核心态下运行,用户代码在用户态下运行。系统中一共有四个权限级别,R1和R2运行设备驱动,R0到R3权限依次降低,R0和R3的权限分别为最高和最低。而我们的**syscall**是一个计算机......
  • rabbitmq交换机类型学习
    1Exchanges概念​RabbitMQ消息传递模型的核心思想是:生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。​相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面......
  • rabbitmq学习记录
    一、RabbitMQ的概念RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于:它不......
  • 学习环境(浏览器与编辑器)配置,HTTP常识
    学习大纲一前端html5/css3写页面2.JaveScript/ES6/jQuery/Bootstrap写页面逻辑二PHP编程PHP语法,数据类型,面向对象,命令空间,数据库POD,Composer,MVC三Laravel框架微信小程序,CRM,Laravel基础,项目分析,数据表创建,前后台的完整开发流程,项目优化与项目上线学习......
  • 机器学习策略篇:详解为什么是ML策略?(Why ML Strategy?)
    为什么是ML策略?从一个启发性的例子开始讲,假设正在调试的猫分类器,经过一段时间的调整,系统达到了90%准确率,但对的应用程序来说还不够好。可能有很多想法去改善的系统,比如,可能想去收集更多的训练数据吧。或者会说,可能的训练集的多样性还不够,应该收集更多不同姿势的猫咪图片,或者更......
  • (17)Lazarus学习之StringGrid1
    01]下拉ComboBox1选择  参考:C:\lazarus\examples\gridexamples\gridcelleditorprocedureTForm1.StringGrid1SelectEditor(Sender:TObject;aCol,aRow:Integer;varEditor:TWinControl);beginif(aCol=3)and(aRow>0)thenbegin//哪些单元格显示Comb......
  • PD Controller 学习
    ProportionalDerivative(PD)ControllerPD控制器(比例-微分控制器)是一种常见的反馈控制器,广泛用于工程和控制系统中,以实现期望的控制效果,如机器人臂的精确位置控制或汽车的速度控制。它通过调节控制输入来减少系统的误差,这个误差是指系统当前状态与期望状态之间的差异。PD控制......
  • 读千脑智能笔记13_读后总结与感想兼导读
    1. 基本信息千脑智能AThousandBrains(美)杰夫·霍金斯浙江教育出版社,2022年9月出版1.1. 读薄率书籍总字数287千字,笔记总字数39938字。读薄率39938÷287000≈13.92%1.2. 读厚方向千脑智能脑机穿越未来呼啸而来虚拟人AI3.0新机器人人工不智能:计......
  • Lua学习笔记
    Lua学习笔记lua的基本语法和数据类型在Lua中,最重要的线程是协同程序(coroutine)它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其它协同程序共享全局变量和其它大部分东西。线程和协程的区别:线程可以同时运行多个,而协程任意时刻只能运行一个,并且处于运行......
  • 嵌入式笔记(1)
    首先确定个人总结上花费的时间:我个人对于嵌入式的定义感觉是比较广泛的所以就以参考书[1]嵌入式的定义:1、嵌入式系统在硬件和软件功能上的局限性比PC大得多;2、一个嵌入式是用于被设计用于某一个特定功能的;3、嵌入式系统是比其他计算机系统质量和可靠性更高的计算机系统;4、某......