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

【题目来源】
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 read
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9') { //!isdigit(c)
		if(c=='-') f=-1; //- is a minus sign
		c=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 read
    int x=0,f=1;
    char c=getchar();
    while(c<'0' || c>'9') { //!isdigit(c)
        if(c=='-') f=-1; //- is a minus sign
        c=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 5

out:
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









 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/587643.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化学习(Reinforcement learning)基本概念

概念&#xff1a; 强化学习是在与环境互动中为达到一个目标而进行的学习过程 三层结构&#xff1a; 基本元素&#xff1a;agent、environment、goal agent&#xff1a;可以理解为玩家&#xff0c;即某个游戏的参与方 environment&#xff1a;环境本身&#xff0c;可以理…

Web后端开发中对三层架构解耦之控制反转与依赖注入

内聚与耦合 内聚 比如说我们刚刚书写的员工的实现类 在这里我们仅仅书写的是和员工相关的代码 而与员工无关的代码都没有放到这里 说明内聚程度较高 耦合 以后软件开发要高内聚 低耦合 提高程序灵活性 扩拓展性 分析代码 如何解耦 创建容器 提供一个容器 存储东西 存储E…

基于FPGA的数字信号处理(5)--Signed的本质和作用

前言 Verilog中的signed是一个很多人用不好&#xff0c;或者说不太愿意用的一个语法。因为不熟悉它的机制&#xff0c;所以经常会导致运算结果莫名奇妙地出错。其实了解了signed以后&#xff0c;很多时候用起来还是挺方便的。 signed的使用方法主要有两种&#xff0c;其中一种…

Android View事件分发面试问题及回答

问题 1: 请简述Android中View的事件分发机制是如何工作的&#xff1f; 答案: 在Android中&#xff0c;事件分发机制主要涉及到三个主要方法&#xff1a;dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent(). 当一个触摸事件发生时&#xff0c;首先被Activity的…

配置 Trunk,实现相同VLAN的跨交换机通信

1.实验环境 公司的员工人数已达到 100 人&#xff0c;其网络设备如图所示。现在的网络环境导致广播较多网速慢&#xff0c;并且也不安全。公司希望按照部门划分网络&#xff0c;并且能够保证一定的网络安全性。 其网络规划如下。 PC1和 PC3为财务部&#xff0c;属于VLAN 2&…

邦注科技 温控箱对企业的重要性

注塑加工是将加热的熔融塑料注入模具中形成所需产品的工艺过程。良好的注塑加工工艺需要控制好许多参数&#xff0c;其中最重要的因素之一就是模具的温度。模具温度的不稳定会导致产品尺寸大小、表面缺陷等方面的问题&#xff0c;甚至会导致生产不良品&#xff0c;加大生产成本…

Educational Codeforces Round 165 (Rated for Div. 2 ABCDE 题)视频讲解

A. Two Friends Problem Statement Monocarp wants to throw a party. He has n n n friends, and he wants to have at least 2 2 2 of them at his party. The i i i-th friend’s best friend is p i p_i pi​. All p i p_i pi​ are distinct, and for every i ∈…

通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?

作者&#xff1a;别象 进入 2024 年&#xff0c;AI 热度持续上升&#xff0c;翻阅科技区的文章&#xff0c;AI 可谓是军书十二卷&#xff0c;卷卷有爷名。而麦肯锡最近的研究报告显示&#xff0c;软件工程是 AI 影响最大的领域之一&#xff0c;AI 已经成为了软件工程的必选项&…

FLUKE万用表17B+的电压档最大内阻

项目中遇到一个测量兆欧级别电阻两端电压的问题&#xff0c;发现按照上图中的电路搭建出来的电路测得的电压为8.25V左右&#xff0c;按理说应为9V才对&#xff0c;后来想到万用表测量电压档不同的档位会有不同内阻&#xff0c;测量的电阻应远小于万用表电压档内阻才有效。本次测…

顶尖页面性能优化跃升之道:uniapp首屏加载性能极致优化策略权威指南(白屏现象终结攻略)

页面加载性能优化至关重要&#xff0c;直接影响用户体验满意度及网站流量转化。优化加载性能可以减少用户等待时间&#xff0c;提升交互响应&#xff0c;有效减少出现白屏的情况&#xff0c;增加用户留存&#xff0c;同时有利于搜索引擎排名&#xff0c;对网站流量、品牌形象及…

【常规】解决win11的Edge浏览器掉线问题

文章目录 【问题】【解决】step1 右键点击wifi--【网络和Internet设置】step2 点击打开后&#xff0c;打开【高级网络设置】后边的箭头step3 进入下一级以后&#xff0c;点击【WLAN】右侧的箭头step4 【更多适配选项】--【编辑】step5 取消Internet协议版本6&#xff08;TCP/IP…

php反序列化字符串逃逸

字符串逃逸 字符串逃逸是通过改变序列化字符串的长度造成的php反序列化漏洞 一般是因为替换函数使得字符串长度发生变化&#xff0c;不论变长还是变短&#xff0c;原理都大致相同 在学习之前&#xff0c;要先了解序列化字符串的结构&#xff0c;在了解结构的基础上才能更好理解…

Qt Creator导入第三方so库和jar包——Qt For Android

前言 之前了解了在Android Studio下导入so库和jar包&#xff0c;现在实现如何在Qt上导入so库和jar包。 实现 下面是我安卓开发&#xff08;需调用安卓接口的代码&#xff09;的目录&#xff08;图1&#xff09;&#xff0c;此目录结构和原生态环境&#xff08;Android Studi…

PS证件照

证件照尺寸 小一寸&#xff1a;2.2cm*3.3cm 一寸&#xff1a;2.5cm*3.5cm 像素413*295 &#xff08;分辨率为300像素/英寸&#xff09; 比例5&#xff1a;7 二寸&#xff1a;3.5cm*4.9cm 二寸照相比例是4&#xff1a;3&#xff0c;像素是626*413 蓝底&#xff1a;R&a…

python学习之词云图片生成

代码实现 import jieba import wordcloudf open("D:/Pythonstudy/data/平凡的世界.txt", "r", encoding"utf-8") t f.read() print(t) f.close() ls jieba.lcut(t) txt " ".join(ls)w wordcloud.WordCloud(font_path"D:/cc…

【Unity动画系统】详解Root Motion动画在Unity中的应用(二)

Root Motion遇到Blend Tree 如果Root Motion动画片段的速度是1.8&#xff0c;那么阈值就要设置为1.8&#xff0c;那么在代码中的参数就可以直接反映出Root Motion的最终移动速度。 Compute Thresholds&#xff1a;根据Root Motion中某些数值自动计算这里的阈值。 Velocity X/…

使用 Python 和 OpenCV 进行实时目标检测的详解

使用到的模型文件我已经上传了&#xff0c;但是不知道能否通过审核&#xff0c;无法通过审核的话&#xff0c;就只能 靠大家自己发挥实力了&#xff0c;^_^ 目录 简介 代码介绍 代码拆解讲解 1.首先&#xff0c;让我们导入需要用到的库&#xff1a; 2.然后&#xff0c;设…

《QT实用小工具·四十三》历史编辑器(支持历史搜索 关键字匹配)

1、概述 源码放在文章末尾 该项目实现了在输入框中输入部分信息能全部展现之前的历史输入信息&#xff0c;支持历史搜索和关键词匹配&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "historymodel.h" #include <QM…

Java发送请求-http+https的

第一步&#xff1a;建议ssl连接对象&#xff0c;信任所有证书 第二步&#xff1a;代码同时支持httphttps 引入源码类 是一个注册器 引入这个类&#xff0c;和它的方法create 注册器&#xff0c;所以对http和https都进行注册&#xff0c;参数为id和item&#xff0c;其中http的…

【已解决】pandas读excel中长数字变成科学计数法的问题

pandas 读excel中的长数字时&#xff0c;即使excel中已经设置为文本&#xff0c;读进df后也会自动变成科学计数法。 在日常的数据分析和处理工作中&#xff0c;Excel和pandas是数据分析师们不可或缺的得力助手。然而&#xff0c;在使用pandas读取Excel文件时&#xff0c;我们有…