首页 > 其他分享 >浅谈笛卡尔树

浅谈笛卡尔树

时间:2022-11-01 23:13:48浏览次数:75  
标签:ch cur 笛卡尔 int tp stk 浅谈

笛卡尔树(Cartesian Tree),是一种二叉树,每个节点都有两个信息 \((x_i,y_i)\),其中把 \(x_i\) 单独拎出来看是一棵二叉搜索树(\(ls_u<u<rs_u\)),而把 \(y_i\) 拎出来是一个小根堆(\(u<ls_u,rs_u\))。

废话不说,先看一道模板题 P5854 【模板】笛卡尔树,这道题题意就是说:

给你一个排列 \((p_1,p_2,\cdots,p_n)\),构造信息为 \((i,p_i)\) 的笛卡尔树。

这道题可以 \(p_1\) 到 \(p_n\) 依次加进来(事实上所有建笛卡尔树都是先按 \(x_i\) 排序的,只不过这个 \(i\) 本来就是有序的)。

然后你可以想到每次肯定是尽量往右插,这样才能得到结果。一个事实是,笛卡尔树的构建是唯一的(笔者暂时并未想清楚原因,欢饮评论区留言)。

更具体地来说,每一次找到一个最大的比当前要插的数小的最大的点,设为 \(v\),则将 \(v\) 的右儿子设为当前点(如果 \(v\) 存在的话)。如果 \(v\) 已经有右儿子了的话,就将当前的点接在 \(v\) 和 \(rs_v\) 中间。

代码如下(貌似要进行一些卡常?):

// AC

#include <bits/stdc++.h>

using namespace std;

const int N = 1e7 + 10;
int n, p[N], stk[N], tp = 0, cur;
int ch[N][2]; // 0: left son, 1: right son

inline int read() {
    int x = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9') ch = getchar();
    while(ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x;
}

int main() {
    // ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
    n = read();
    for(int i = 1; i <= n; i++) {
        p[i] = read();
        cur = tp;
        while(cur > 0 && p[stk[cur]] > p[i]) --cur;
        if(cur > 0) ch[stk[cur]][1] = i;
        if(cur < tp) ch[i][0] = stk[cur + 1];
        stk[tp = ++cur] = i;
    }
    long long ans1 = 0, ans2 = 0;
    for(int i = 1; i <= n; i++) {
        ans1 ^= 1LL * i * (ch[i][0] + 1);
        ans2 ^= 1LL * i * (ch[i][1] + 1);
    }
    printf("%lld %lld\n", ans1, ans2);
    return 0;
}

标签:ch,cur,笛卡尔,int,tp,stk,浅谈
From: https://www.cnblogs.com/Jerry-Jiang/p/16849436.html

相关文章

  • 浅谈 web3
     web3——互联网的未来?  web3,很多人觉得是个骗局,是在割韭菜。 因为大部分介绍web3的文章都离不开NFT、数字货币、区块链、比特币、以太坊、元宇宙等概......
  • 浅谈大数据时代智能工厂能源管理系统的设计和应用
    陈盼安科瑞电气股份有限公司上海嘉定201801摘要:如今,传统制造业正在发生着巨大变革与创新,智能工厂概念应运而生,其中,能源管理系统是工厂生产资源管控的重要平台,是现代信息技......
  • 浅谈智能电表的预付费远程抄表及多回路监测系统设计及应用
    陈盼安科瑞电气股份有限公司上海嘉定201801【摘要】随着社会的发展,人工抄表这种费时费力、低效的工作模式将被淘汰,智能电表远程抄表系统应运而生。智能电表既能远程抄表,......
  • P5854 【模板】笛卡尔树
    【模板】笛卡尔树题目描述给定一个\(1\simn\)的排列\(p\),构建其笛卡尔树。即构建一棵二叉树,满足:每个节点的编号满足二叉搜索树的性质。节点\(i\)的权值为\(p......
  • 浅谈Java多线程之FutureTask
    Runnable和Callable是多线程中的两个任务接口,实现接口的类将拥有多线程的功能,FutureTask类与这两个类是息息相关!FutureTask继承体系看下这张图,原来FutureTask类实现了Runnab......
  • 浅谈Redis与分布式锁
    后续进行补充,先放个链接在这,哈哈 https://zhuanlan.zhihu.com/p/378797329#:~:text=%E6%83%B3%E8%A6%81%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%EF%BC......
  • 浅谈幂等性
    一.幂等性所谓的幂等性,是分布式环境下的一个常见问题,一般是指我们在进行多次操作时,所得到的结果是一样的,即多次运算结果是一致的。也就是说,用户对于同一操作,无论是发起一次......
  • 【UOJ424】count(笛卡尔树,DP,生成函数,矩阵快速幂)
    首先可以发现两个序列\(A,B\)同构当且仅当它们的笛卡尔树同构。那么可以考虑枚举笛卡尔树,然后判断它能否构成满足题目条件的序列。发现一棵笛卡尔树满足条件当且仅当它......
  • 浅谈PHP设计模式的观察者模式
    简介观察者模式是行为型模式的一种,定义了对象间一对多的关系。当对象的状态发生变化时候,依赖于它的对象会得到通知。适用场景类似触发钩子事件,可做消息通知、框架底层......
  • 浅谈我们在处理Excel的数据原则, 其实学习并没有你想的那么难
    写在前面:ExcelVBA处理重复数据的方法​Excel-VBA中处我们在处理Excel数据时,很多时候都可以分为三个步骤,读取整理数据、计算构造输出数据、输出结果。前者和后者会和Excel......