首页 > 其他分享 >【模板】笛卡尔树

【模板】笛卡尔树

时间:2022-08-14 14:46:18浏览次数:81  
标签:笛卡尔 int top stk llt 模板

笛卡尔树是一种二叉树,每个节点 \(i\) 由 \(\left(k_i,w_i\right)\) 构成, 其中,\(k\) 满足BST 的性质,\(w\) 满足堆的性质。

  • 若 \(k,w\) 互不相同,则构成的笛卡尔树唯一;

  • 两个点的 \(LCA\) 即它们的 \(RMQ\)。


构建一颗笛卡尔树,先以 \(k\) 为序排序,再维护一条右链。(@虚树)


\(\textrm{luogu P5854 【模板】笛卡尔树}\)

#include <stdio.h>
#define llt long long int
const int N = 1e7+10;
int n, p[N];
int stk[N], top;
int rid[N], lid[N];
llt lans, rans;
void cts() {
	for(int i = 1, k = 0;i <= n;++i) {
		while(k&&p[stk[k]] > p[i]) 
			--k;
		if(k) 
			rid[stk[k]] = i;
		if(k < top) 
			lid[i] = stk[k+1];
		stk[++k] = i;
		top = k;
	}
}
signed main() {
	get_int(n);
	for(int i = 1;i <= n;++i) 
		get_int(p[i]);
	cts();
	for(int i = 1;i <= n;++i) {
		lans ^= i*(lid[i]+1LL);
		rans ^= i*(rid[i]+1LL);
	}
	printf("%lld %lld\n",lans,rans);
	return 0;
}

ps:本题卡常,请使用较快的读入方式

标签:笛卡尔,int,top,stk,llt,模板
From: https://www.cnblogs.com/bikuhiku/p/Descartes_tree.html

相关文章

  • C++之类模板的分文件编写问题以及解决
    C++之类模板的分文件编写问题以及解决建议模板不要分文件编写Person.h文件#pragmaonce#include<iostream>usingnamespacestd;#include<string>template<c......
  • HR面模板(持续更新中)
    HR面:一般问题:1.自我介绍(主要讲能突出自己的经历,会的编程技术一语带过)。2.你觉得你有什么优点和缺点?如何克服这些缺点?3.说一件大学里你自己比较有成就感的一件事情,为此......
  • 【学习笔记/模板】扫描线 周长并
    先开坑,晚上再写。P1856[IOI1998][USACO5.5]矩形周长PictureCode#include<cstdio>#include<algorithm>usingnamespacestd;constintMAXN=1e5+10;intn,......
  • [ 模板 ] 求凸包面积
    先求凸constintN=1e6;structPoint{doublex,y;doubleoperator^(constPoint&b)const{returnx*b.y-y*b.x;}};Pointstackk[N];......
  • VUE学习-基础(基础语法 & 模板语法)
    基础语法引入vue<!--开发环境版本,包含了有帮助的命令行警告--><scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><!--生产环境版本,优化了尺寸......