LGP5854 [LG TPLT] 笛卡尔树 学习笔记

news/2025/4/19 3:39:24/文章来源:https://www.cnblogs.com/OrinLoong/p/18717857

LGP5854 [LG TPLT] 笛卡尔树 学习笔记

Luogu Link

题意简述

给定一个长为 \(n\) 的排列 \(p\),以 \(i\) 为键,\(p_i\) 为值构建 \(p\) 中所有元素的笛卡尔树。

做法解析

定义“右链”为从根开始一直往右儿子走形成的一条链。
因为我们照键从小到大的顺序插入每一个元素,所以我们在插入到元素 \((i,p_i)\) 时,其一定不是任何结点的左儿子,也就是说其一定在右链上。我们在右链从下往上找到第一个值大于 \(p_i\) 的元素 \(u\),然后让 \(i\) 成为 \(u\) 的右儿子,把 \(u\) 的原右子树,也就是“右链”被 \(u\) 截下来的部分作为 \(u\) 的左子树。

pEKRE7Q.png

发现右链上的 \(p_i\) 有单调性,于是用单调栈维护右链的值,这样时间复杂度得到保证 \(O(N)\)

代码实现

#include <bits/stdc++.h>
using namespace std;
namespace obasic{typedef long long lolo;template <typename _T>void readi(_T &x){_T k=1;x=0;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')k=-1;for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0';x*=k;return;}template <typename _T>void writi(_T x){if(x<0)putchar('-'),x=-x;if(x>9)writi(x/10);putchar(x%10+'0');}
};
using namespace obasic;
const int MaxN=1e7+5;
int N,W[MaxN],stk[MaxN],ktp;
int ls[MaxN],rs[MaxN];lolo ans1,ans2;
int main(){readi(N);for(int i=1;i<=N;i++)readi(W[i]);for(int i=1;i<=N;i++){int k=ktp;while(k&&W[stk[k]]>W[i])k--;if(k)rs[stk[k]]=i;if(k<ktp)ls[i]=stk[k+1];stk[++k]=i,ktp=k;}for(int i=1;i<=N;i++)ans1^=1ll*i*(ls[i]+1);for(int i=1;i<=N;i++)ans2^=1ll*i*(rs[i]+1);writi(ans1),putchar(' '),writi(ans2);return 0;
}

反思总结

这道题键是下标所以直接顺着插就行了,否则要先把元素照键排个序。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux之proc

proc proc是一个伪文件系统,它提供了内核数据结构的接口。一些/proc文件直接指向了内核的参数。 编辑/proc 文件中的设置与直接编辑内核参数相同。例如vmstat,指令就是读取的/proc/meminfo中的信息。/proc下常见的子文件/proc/cpuinfo:提供 CPU 信息 /proc/meminfo:提供内存…

11.4.3 凸目标的收敛性分析

式\((11.47)\)应该有误,不等号左边还应该有一个项\(-E[||x_T-x^{*}||^2]\),之所以没写估计是因为认为\(x_T\)非常接近\(x^{*}\),所以可以忽略;另外不等号右边的括号打错了,应该是 \[2\underset{t=1}{\overset{T}{\sum}}\eta_tE[R(x_t)]-2S_1R^*-S_2L^2 \],其中\(S_1=\und…

Linux之yum源

【摘要】Linux的yum源的使用是系统工程师必不可少的技能,通过本文了解yum仓库的原理以及使用。一、简介 yum仓库原理yum是基于C/S模型工作的机制。 Client通过yum.repo文件查找远程的Server端的地址。 Server不会把所有包直接给Client,Server会提供给Client一个元数据信息,下…

AGC053C 题解

Solution 前面部分略,相信别的题解写得很详细。 本题解集中解释 \(p(d)\) 的计算。 \(p(d)\) 表示对于 \(\forall A_i\),\(B_1\cdots B_{i+d}\) 中有比它大的数。 那么这么考虑,已经加入 \(A_1 \cdots A_{i-1}\)。对于 \(A_i\) ,如果大于 \(\min(A_1 \cdots A_{i-1},B_1 \c…

第一篇阅读笔记:理解构建的核心原则

在《构建之法》这本书中,作者深入探讨了构建高质量软件系统的基本原则,这些原则不仅关系到系统的功能实现,还关乎系统的长期可维护性、可扩展性、可测试性以及稳定性等方面。以下是我在阅读过程中对书中核心概念的理解和总结。构建的目标 构建高质量软件系统的目标远不止是实…

第二篇阅读笔记:架构决策与技术选型

架构决策对于系统的成功至关重要。在现代软件开发中,架构设计不仅仅涉及如何组织系统的各个模块、数据流和控制流,还涉及到如何选择适合的技术栈。技术选型直接影响到系统的性能、可维护性、开发效率和扩展性,因此,在系统架构设计过程中,做出正确的技术决策显得尤为重要。…

使用word模板的科研论文编写

编写SCD论文等的时候,可能出现官网的论文模板不够全面.一般我们使用latex作为论文编写模板,格式等都方便控制和编写,而word模板操作起来较为复杂.但是官网有些时候可能找不到latex的模板内容,不得不使用word模板.word的样式模板等功能十分好用,但是官网的模板不一定有那么好的格…

QWORD与DWORD

DWORD(双字)和QWORD(四字)是计算机中用于表示数据大小的术语,主要区别在于它们的位数和用途: 1. 位数与组成DWORD (Double Word)32位(4字节)由两个连续的16位“字”(WORD)组成,通常用于32位系统或编程中。QWORD (Quad Word)64位(8字节)由四个连续的16位“字”组成…