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

P5854 【模板】笛卡尔树

时间:2022-10-22 11:45:04浏览次数:88  
标签:P5854 le 笛卡尔 int 10 节点 模板 define

题目链接

P5854 【模板】笛卡尔树

题目描述

给定一个 \(1 \sim n\) 的排列 \(p\),构建其笛卡尔树。

即构建一棵二叉树,满足:

  1. 每个节点的编号满足二叉搜索树的性质。
  2. 节点 \(i\) 的权值为 \(p_i\),每个节点的权值满足小根堆的性质。

输入格式

第一行一个整数 \(n\)。

第二行一个排列 \(p_{1 \dots n}\)。

输出格式

设 \(l_i,r_i\) 分别表示节点 \(i\) 的左右儿子的编号(若不存在则为 \(0\))。

一行两个整数,分别表示 \(\operatorname{xor}_{i = 1}^n i \times (l_i + 1)\) 和 \(\operatorname{xor}_{i = 1}^n i \times (r_i + 1)\)。

样例 #1

样例输入 #1

5
4 1 3 2 5

样例输出 #1

19 21

提示

【样例解释】

\(i\) \(l_i\) \(r_i\)
\(1\) \(0\) \(0\)
\(2\) \(1\) \(4\)
\(3\) \(0\) \(0\)
\(4\) \(3\) \(5\)
\(5\) \(0\) \(0\)

【数据范围】

对于 \(30\%\) 的数据,\(n \le 10^3\)。

对于 \(60\%\) 的数据,\(n \le 10^5\)。

对于 \(80\%\) 的数据,\(n \le 10^6\)。

对于 \(90\%\) 的数据,\(n \le 5 \times 10^6\)。

对于 \(100\%\) 的数据,\(1 \le n \le 10^7\)。

解题思路

笛卡尔树

笛卡尔树=堆+二叉搜索树
一般对于一个序列建立笛卡尔树,将 \(a[i]\) 建堆的同时将 \(i\) 建二叉搜索树,用栈维护最右链,栈顶元素即最右链最底部的下标,以最小堆为例,对于新插入的节点 \(a[i]\),找到最右链第一个不大于 \(a[i]\) 的节点 \(j\),则由最小堆的性质,\(i\) 必须作为 \(j\) 的一个子节点,而还要求下标满足二叉搜索树的性质,\(i\) 应该作为 \(j\) 的右儿子,而原来 \(j\) 的右儿子 \(k\),\(a[k]>a[i]\),其应该成为 \(i\) 的左儿子

  • 时间复杂度:\(O(n)\)

代码

// Problem: P5854 【模板】笛卡尔树
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5854
// Memory Limit: 250 MB
// Time Limit: 500 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
// #define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=1e7+5;
int n,a[N],l[N],r[N];
int stk[N],top;
int main()
{
    read(n);
    for(int i=1;i<=n;i++)
    {
    	read(a[i]);
    	int k=top;
    	while(k>0&&a[stk[k]]>a[i])k--;
    	if(k)r[stk[k]]=i;
    	if(k<top)l[i]=stk[k+1];
    	stk[++k]=i;
    	top=k;
    }
    LL L=0,R=0;
    for(int i=1;i<=n;i++)
    	L^=(LL)i*(l[i]+1),R^=(LL)i*(r[i]+1);
    printf("%lld %lld",L,R);
    return 0;
}

标签:P5854,le,笛卡尔,int,10,节点,模板,define
From: https://www.cnblogs.com/zyyun/p/16815699.html

相关文章

  • 3_hugo模板框架
    3_介绍hugo的模板hugo使用go的html/template和text/templete库为基础进行模板操作下面只是基础的gotemplate操作,为了更深度的了解请看go文档go模板提供了一......
  • 定时器、外部中断0,以及查询和中断的模板
    这里拿一个0-60秒表做案例://sbit定义四个数码管unsignedcharcount,miao;voidmain(){  TMOD=0X01;  //设置T0为工作方式1  TH0=0XEE;    TL0=0X00......
  • 模板字符串
    模板字符串在ES5当中,当需要把多个字符串和多个变量拼接至一起时,写法相当的复杂varname="狗蛋",age=12,gender="男生"varstr="大家好,我是"+name+",今年"+age+"岁了,......
  • 树状数组两种修改+求和 | 模板
    \(O(mlogn)\),单次查询为\(O(logn)\)实际最坏情况下优于线段树,因为跑不满...1.单点修改+区间求和区间求和变为前缀和相减。#include<iostream>#include<cstdio>const......
  • 基于链式前向星的堆优化dijsktra | 模板
    关于SPFA,ta死了基于链式前向星的堆优化\(dijsktra\):复杂度\(O(mlogn)\),要求非负权。#include<iostream>#include<cstdio>#include<cstring>#include<queue>#inc......
  • 【总结】大学生寒假社会实践总结-社区志愿关爱模板
    苏州科技大学大学生寒假社会实践总结关于2018年寒假在沿河社区进行社区志愿关爱实践活动服务的总结 所在学院:电子与信息工程学院学生姓名:戚春阳学号:指导教师: 职务/职......
  • 【总结】大学生寒假社会实践-社区志愿服务模板
      苏州科技大学大学生寒假社会实践报告大学生社区志愿服务的实践报告 所在学院:电子与信息工程学院学生姓名:戚春阳学号:实践组织:沿河社区实践日期:2017年2月1日――201......
  • EasyExcel根据模板填充(多sheet页封装工具方法)
    原文链接:https://www.cnblogs.com/Donnnnnn/p/15412128.html官方教程:https://www.yuque.com/easyexcel/doc/fill   一、填充模板里单个sheet页 模板  ......
  • CSP 普及 & 提高 考点 模板合集
    CSP普及&提高考点零、杂项加速cin/cout:ios::sync_with_stdio(false);。注:放在main函数的第一行,但使用它之后不能使用scanf/printf。避坑/防爆0指南。快读:inl......
  • vue3的学习笔记:MVC、Vue3概要、模板、数据绑定、用Vue3 + element ui 实现购物车案例
    一、前端MVC概要1.1、库与框架的区别框架是一个软件的半成品,在全局范围内给了大的约束。库是工具,在单点上给我们提供功能。框架是依赖库的。Vue是框架而jQuery则是库。......