【CF675D】Tree Construction
题目大意:给定一个有 N 个数组成的序列,在此基础上构建一棵二叉排序树,求每个节点(根节点除外)的父节点的编号是多少。
题解:首先,根据二叉排序树的不稳定性,直接模拟构建二叉排序树肯定会超时,因此需要用其他的数据结构来模拟 BST。在这里可以用平衡树来模拟,即:用一个 \(set\) 来维护这 N 个序列,因为平衡树的旋转功能使得父节点会发生改变,所以需要另外记录下对应的 BST 中,每个节点“本应该”的孩子是谁,即:用两个 \(map\) 来记录下每个节点对应的左右孩子即可。
引理1:BST 的构建是在原树构架的基础上进行的,即:未插入节点前的树中的节点在插入节点之后的相对位置不会发生改变。
引理2:在插入新节点时,该节点一定被插入在其前驱的右孩子或后继的左孩子的位置。
证明过程可以分以下几个步骤:
- 证明不可能出现前驱的右孩子和后继的左孩子均有节点的情况。
- 证明不可能出现前驱没有右孩子且后继没有左孩子的情况。
- 证明前驱和后继的 LCA 应该是这二者之一。
代码如下
#include <bits/stdc++.h>
using namespace std;
int n,val;
set<int> s;
map<int,int> ls,rs;
void solve(){
scanf("%d",&val);
s.insert(val);
for(int i=1;i<n;i++){
scanf("%d",&val);
auto it=s.upper_bound(val);
if(it!=s.end()&&ls.find(*it)==ls.end()){
ls[*it]=val;
printf("%d",*it);
}else{
--it;
rs[*it]=val;
printf("%d",*it);
}
putchar(i==n-1?'\n':' ');
s.insert(val);
}
}
int main(){
scanf("%d",&n);
solve();
return 0;
}
【CF675D】Tree Construction的更多相关文章
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【POJ3237】Tree 树链剖分+线段树
[POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...
- 【BZOJ】【2631】Tree
LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...
- 【Luogu1501】Tree(Link-Cut Tree)
[Luogu1501]Tree(Link-Cut Tree) 题面 洛谷 题解 \(LCT\)版子题 看到了顺手敲一下而已 注意一下,别乘爆了 #include<iostream> #in ...
- 【BZOJ3282】Tree (Link-Cut Tree)
[BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...
- 【AtCoder3611】Tree MST(点分治,最小生成树)
[AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...
- 【HDU5909】Tree Cutting(FWT)
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
随机推荐
- Ueditor使用笔记
富文本编辑器在javaweb项目中还是比较常见的,如:ckeditor.kindeditor.ueditor等.今天主要叙述的对象为ueditor,它属于百度的.闲话不多说,下面开始介 ...
- 【第三方插件】使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- Qt控件使用汇总
QTableWidget: //tab居中显示 QTabWidget::tab-bar { alignment: center; } //tab边框样式,边框颜色,前景色 QTabBar::tab { ...
- 微信小程序云开发之云函数创建
云函数 云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写.一键上传部署即可运行后端代码. 小程序内提供了专门用于云函数调用的 API.开发者可以在云函数内使用 wx-server-sdk ...
- .Net-C#异步程序知识点梳理
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- [转载] 相机越贵画质越好?聊聊CMOS设计
似乎在很多人心目中,个位数机身就代表了品牌最强成像素质,这或许有“人不识货钱识货”的道理在作祟,但事实上如佳能1DX2或尼康D5,又或是索尼A9这种旗舰机真的就一定能代表本家的画质巅峰么?这一切都得从 ...
- 【源码】进入ASP.NET MVC流程的大门 - UrlRoutingModule
UrlRoutingModule的功能 在ASP.NET MVC的请求过程中,UrlRoutingModule的作用是拦截当前的请求URL,通过URL来解析出RouteData,为后续的一系列流程提供 ...
- 【OpenCV学习笔记之一】图像加载,修改及保存
加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...
- 余玄相似度,TF-IDF
能干什么? 文章去重,语句去重,提取关键词(文章摘要,页面指纹),图片识别,语音识别 想要做一个相似度,最重要的是什么? 必须得到一个度量:计算个体之间的相似程度(分数,0-1之间,0代表完全不同,一 ...
- html5实现拖拽上传头像
1. 将客户端(本地电脑)中的图片拖到网页中 要点: html5 拖放, FileReader html: <div id="container" ondrop=" ...