【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\) 则求一 ...
随机推荐
- poj_2352树状数组
因为y已经排好序了,用x坐标建立一维树状数组 #include<iostream> #include<cstdio> #include<cstring> using ...
- poj--3620--Avoid The Lakes(dfs)
Avoid The Lakes Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Subm ...
- SQL Server单表已700w+将普通表转换成分区表1
最近项目中,某个表数据量爆发时增长,单表已700w+,读写性能急剧下降,所以考虑加入分区表以解燃眉之急,后续还是要分表分库,当然这是后话.下面简要说一下将普通表转为分区表的步骤. 一.创建文件组 ...
- rest_framework-节流-总结完结篇
列表从后往前读 #1.在request中获取IP#2.访问记录 VISIT_RECORD = {} 放缓存 数据库 都可以 建议缓存import timeclass VisitThrottle(obj ...
- sql点滴
http://www.cnblogs.com/tylerdonet/p/5509398.html
- iview中 ...用法
1. 2. 3. 4.可以将divs转为数组解构 5. 解构 6.作为函数的参数 7.作为参数遍历
- [BJWC2011]禁忌 AC 自动机 概率与期望
#include<cstdio> #include<algorithm> #include<cstring> #include<string> #inc ...
- laravel 自定义全局函数
在 app 目录下创建一个 Helpers 目录,在此目录下创建文件.这些文件就是全局函数文件.如叫:function.php 加载此文件: 1 . 在 bootstrap/autoload.php ...
- iOS开发——导入c文件引起的 Unknown type name 'NSString' 错误
一般情况下出现“Unknown type name”是头文件互相引用出现的,这里不是这个,由于源码使用是c\c++与oc混编,下面三种可以解决问题方案. 解决方案一: 选择所有.c文件,将属性的 id ...
- js中return 、return false 、return true、break、continue区别
在开发中不熟悉这三者区别的同学,一般都知道return可以中止,但会根据字面意思觉得return true 中止当前函数执行,但其后的函数还会继续执行.return false 中止当前函数执行,其后 ...