【Henu ACM Round#17 E】Tree Construction
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
做这题之前先要知道二叉排序树的一个性质。
就是它的中序遍历的结果就是这个数组升序排序。
(且每个节点的左边的节点都是比这个节点的值小的,每个节点的右边的节点都是比这个节点的值大的。
则我们把原数组排序。
然后在这里面找到原来数组的a[1]的位置idx;
则1..idx-1这些数字都是a[1]的左子树。
idx+1..n这些数字都是a[1]的右子树。
然后idx的左儿子是什么呢?
肯定就是1..idx-1中在原数组中最早出现的数字。
(因为最早出现,且又比它小。
那么肯定就在根节点的左儿子上了。
那么idx的右儿子呢?
会发现也是idx+1..n中出现最早的数字.
(比它大,且又出现得最早.所以肯定是它的右儿子。
然后就会发现。这是一个递归的过程了。
每个儿子接下来都是这样的。
只需用线段树。维护所有区间内最早出现的数字即可(也即 下标最小的数字
【代码】
#include <bits/stdc++.h>
#define ll long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N = 1e5;
int n,mi[N<<2];
struct abc{
int id,x;
bool operator < (const abc &b) const{
return x < b.x;
}
}a[N+10];
int tag[N+10],fa[N+10],b[N+10];
void build(int l = 1,int r = n,int rt = 1){
if (l==r){
mi[rt] = l;
return;
}
int mid = (l+r)>>1;
build(lson);
build(rson);
int lx = mi[rt<<1],rx = mi[rt<<1|1];
if (a[lx].id<a[rx].id){
mi[rt] = lx;
}else mi[rt] = rx;
}
int query(int L,int R,int l = 1,int r = n,int rt=1){
if (L<=l && r <= R){
return mi[rt];
}
int mid = (l+r)>>1;
int id =-1;
if (L<=mid){
id = query(L,R,lson);
}
if (mid<R){
int temp1 = query(L,R,rson);
if (id==-1) id = temp1;
else if (a[temp1].id<a[id].id) id = temp1;
}
return id;
}
void dfs(int l,int r,int f){
int idx = query(l,r);
fa[a[idx].id] = f;
if (idx<r) dfs(idx+1,r,a[idx].id);
if (l<idx) dfs(l,idx-1,a[idx].id);
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
#ifdef LOCAL_DEFINE
freopen("rush.txt","r",stdin);
#endif // LOCAL_DEFINE
cin >> n;
for (int i = 1;i <= n;i++){
cin >> a[i].x;
a[i].id = i;
b[i] = a[i].x;
}
sort(a+1,a+1+n);
build();
dfs(1,n,0);
for (int i = 2;i <= n;i++)
cout << b[fa[i]]<<' ';
return 0;
}
【Henu ACM Round#17 E】Tree Construction的更多相关文章
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
- 【Henu ACM Round#17 D】Hexagons!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目的图吓人. 找下规律就会发现从内到外是1,6,12,18 即1,16,26,36... 即1+6(1+2+3+...) 等差求和 ...
- 【Henu ACM Round#17 C】Kitahara Haruki's Gift
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 判断sum/2这个价值能不能得到就可以了. 则就是一个01背包模型了. 判断某个价值能否得到. f[j]表示价值j能否得到. f[0 ...
- 【Henu ACM Round#17 B】USB Flash Drives
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 排序,逆序.贪心选较大的就好. [代码] #include <bits/stdc++.h> #define ll lon ...
- 【Henu ACM Round#17 A】Simple Game
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是放在m-1或者m+1的. (m-1是左边的点都离a最近,而m+1则是右边的点都离他最近. 看看哪个更好就行 [代码] #inc ...
- 【Henu ACM Round#15 E】 A and B and Lecture Rooms
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最近公共祖先. (树上倍增 一开始统计出每个子树的节点个数_size[i] 如果x和y相同. 那么直接输出n. 否则求出x和y的最近 ...
- 【Henu ACM Round #13 E】Spy Syndrome 2
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对m个串建立一棵字典树. 然后对主串. 尝试从第一个位置开始.在字典树中尝试匹配 如果匹配到了位置i 就再从位置i+1开始尝试匹配 ...
- 【Henu ACM Round#24 E】Connected Components
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li. ...
- 【Henu ACM Round#24 D】Iterated Linear Function
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...
随机推荐
- Hello World FastCGI
什么是FastCGI,google吧,測试一个用C++实现的FastCGI程序. 1, Nginx 安装.http://nginx.org/en/download.html.下载解压.configur ...
- 【C#】报表制作<机房重构>
前言 和VB须要引用其它报表软件不同,VS自带报表设计的功能,初次尝试.就感受到了它的强大之处. 报表制作 话不多说.直接报表的制作过程. 1.首先,我们要先制作一个报表的容器.放到我们显示报表的窗口 ...
- less14 颜色函数2
less div{ // hue()色相值 z-index: hue(hsl(90,100%,50%)); //90 ////saturation()饱和度 z-index: saturation(h ...
- ubuntu SDK 安装
纯净sdk安装1.地址-http://gmirror.org/#android-sdk-tools-only(国内镜像)2.下载到本地目录 ~/下载3.进入下载,解压 tar -zxvf androi ...
- 转一篇100offer的采访~35岁程序员是一种什么状态
随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论.很多程序员在工作5-10年以后,都会开始思考5年.10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛弃. 特别是全民 ...
- 13.MongoDB 连接命令格式
转自:https://www.linuxidc.com/Linux/2016-03/129456.htm 使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上.输出结果如 ...
- 插入记录INSERT(二十五)
插入记录INSERT 我们先来看第一个操作:INSERT 实际上在mysql当中一共存在着3种不同的insert语句,我们先来看第一种.它的语法结构如下: 一.插入记录 INSERT [INTO] t ...
- spring boot自动配置之jdbc
1.DataSource配置 1.1 默认配置application.xml spring.datasource.url=jdbc:mysql://localhost/test spring.data ...
- js变量作用域和闭包的示例
<script> /* js是函数级作用域,在函数内部的变量,内部都能访问, 外部不能访问内部的,但是内部可以访问外部的变量 闭包就是拿到本不该属于他的东西,闭包会造成内存泄漏,你不知道什 ...
- EasyUI 之 DataGrid的两种赋值方法
方法一:使用ViewData赋值 首先,我们创建一个User的实体类 public class User { public string UserID; public string UserName; ...