题目传送门


分析

考虑每个数字一定会影响一定的范围,

那么可以记录每个数影响的最长区间和产生的个数,

那么通过这个可以解方程求出对于这个最长区间这个数的所在位置,

可以发现它可以满足一个树形结构,直接用笛卡尔树的方法遍历出来即可


代码

#include <cstdio>
#include <cctype>
#include <stack>
#define rr register
using namespace std;
const int N=811; stack<int>st[N];
int a[N][N],L[N],R[N],n,fi[N],se[N],ls[N],rs[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int x){
if (ls[x]) print(ls[x]);
printf("%d ",x);
if (rs[x]) print(rs[x]);
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=n-i+1;++j)
++a[i][iut()];
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=n-i+1;++j)
if (a[i][j]) L[j]=i,R[j]+=a[i][j];
for (rr int i=1;i<=n;++i){
for (rr int j=0;j<L[i];++j)
if ((j+1)*(L[i]-j)==R[i])
{fi[i]=j,se[i]=L[i]-j-1; break;}
}
for (rr int i=n;i;--i){
if (!st[fi[i]].empty()) ls[i]=st[fi[i]].top(),st[fi[i]].pop();
if (!st[se[i]].empty()) rs[i]=st[se[i]].top(),st[se[i]].pop();
st[L[i]].push(i);
}
print(1);
return 0;
}

#笛卡尔树,构造#洛谷 7726 天体探测仪(Astral Detector)的更多相关文章

  1. 洛谷 P5044 - [IOI2018] meetings 会议(笛卡尔树+DP+线段树)

    洛谷题面传送门 一道笛卡尔树的 hot tea. 首先我们考虑一个非常 naive 的区间 DP:\(dp_{l,r}\) 表示区间 \([l,r]\) 的答案,那么我们考虑求出 \([l,r]\) ...

  2. POJ 1785 Binary Search Heap Construction(裸笛卡尔树的构造)

    笛卡尔树: 每个节点有2个关键字key.value.从key的角度看,这是一颗二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大:从value的角度看,这是一个堆. 题意:以字符串为关键字k ...

  3. POJ 2201 Cartesian Tree ——笛卡尔树

    [题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...

  4. 笛卡尔树Cartesian Tree

    前言 最近做题目,已经不止一次用到笛卡尔树了.这种数据结构极为优秀,但是构造的细节很容易出错.因此写一篇文章做一个总结. 笛卡尔树 Cartesian Tree 引入问题 有N条的长条状的矩形,宽度都 ...

  5. [2018集训队作业][UOJ424] count [笛卡尔树+括号序列+折线法+组合数学]

    题面 请务必不要吐槽我的标签 传送门 思路 一个很重要的结论:原序列的一组同构的解等价于同一棵拥有$n$个节点的笛卡尔树 注意笛卡尔树的定义:父亲节点是区间最值,并且分割区间为左右部分 所以如果两个序 ...

  6. 2018 Multi-University Training Contest 1 H - RMQ Similar Sequence(HDU - 6305 笛卡尔树)

    题意: 对于一个序列a,构造一个序列b,使得两个序列,对于任意的区间 [l, r] 的区间最靠近左端点的那个最大值的位置,并且序列 b 满足 0 < bi < 1. 给定一个序列 a ,求 ...

  7. HDU 1506 Largest Rectangle in a Histogram(单调栈、笛卡尔树)

    题意:给定n个连续排列的矩形的高,矩形的宽都为1.问最大矩形覆盖. 例如:n = 7,h[i] = (2 1 4 5 1 3 3),最大覆盖为8. Sample Input 7 2 1 4 5 1 3 ...

  8. 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)

    Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...

  9. [hdu1506 Largest Rectangle in a Histogram]笛卡尔树

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506 如图,求最大的矩形面积 思路: 笛卡尔树:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key, ...

  10. 笛卡尔树-P2659 美丽的序列

    P2659 美丽的序列 tag 笛卡尔树 题意 找出一个序列的所有子段中子段长度乘段内元素最小值的最大值. 思路 我们需要找出所有子段中贡献最大的,并且一个子段的贡献为其长度乘区间最小值. 这--不就 ...

随机推荐

  1. win32 - 以编程方式访问远程计算机上的文件

    第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式.这是我们需要访问的共享文件夹.(不需要设置everyone权限) 第二步,我们需要为两台在同一domain下的计算机上建立连接. ...

  2. 一次生产环境OOM排查

    一.背景 前几天下午飞书告警群里报起了java.lang.OutOfMemoryError: unable to create new native thread告警,看见后艾特了对应的项目负责人但是 ...

  3. 一文上手图数据备份恢复工具 NebulaGraph BR

    作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳.更快.更易用的备份恢复工具,去年对其进行了比较大的重构.Nebul ...

  4. Java 创建类,对象+调用方法

    1 //测试类 2 public class PersonTest 3 { 4 public static void main(String[] args) 5 { 6 //创建Person类的对象 ...

  5. minio通过docker方式部署

    MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储. 它是与 Amazon S3 云存储服务兼容的 API 官方文档http://docs.minio.org.c ...

  6. RAPTOR 一种基于树的RAG方法,RAG的准确率提高 20%

    一种理解整个文档上下文的新颖的 RAG 方法 RAG 是当前使用LLM的标准方法,大多数现有方法仅从检索语料库中检索短的连续块,限制了对整个文档上下文的整体理解. 最近,一种名为 RAPTOR (Re ...

  7. C++学习笔记之编程思想

    目录 编程思想 单例(Singleton)模式 观察者(Observer)模式 void*.NULL和nullptr C的类型转换 C++的类型转换 适配器(Adapter)模式 泛型编程的思想 模板 ...

  8. 1.Arduino ESP32配置环境

    ESP32开发板管理器地址 https://dl.espressif.com/dl/package_esp32_index.json // 无效时可以使用下面这个 https://raw.github ...

  9. linux shell 字体颜色设置

    使用 echo -e "\033[0;32;40m" 可以将字体设置成绿色. 这里必须使用echo 的选项 "-e",因为后面需要用到转义序列. 转义序列就是一 ...

  10. I/O系统调用

    常用系统调用 open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int op ...