codeforces 675D D. Tree Construction(线段树+BTS)
题目链接:
2 seconds
256 megabytes
standard input
standard output
During the programming classes Vasya was assigned a difficult problem. However, he doesn't know how to code and was unable to find the solution in the Internet, so he asks you to help.
You are given a sequence a, consisting of n distinct integers, that is used to construct the binary search tree. Below is the formal description of the construction process.
- First element a1 becomes the root of the tree.
- Elements a2, a3, ..., an are added one by one. To add element ai one needs to traverse the tree starting from the root and using the following rules:
- The pointer to the current node is set to the root.
- If ai is greater than the value in the current node, then its right child becomes the current node. Otherwise, the left child of the current node becomes the new current node.
- If at some point there is no required child, the new node is created, it is assigned value ai and becomes the corresponding child of the current node.
The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the length of the sequence a.
The second line contains n distinct integers ai (1 ≤ ai ≤ 109) — the sequence a itself.
Output n - 1 integers. For all i > 1 print the value written in the node that is the parent of the node with value ai in it.
3
1 2 3
1 2
5
4 2 3 1 6
4 2 2 4 题意: 给一个序列,构造一个二叉搜索树,然后输出每个节点的父节点; 思路: 在构造二叉搜索树的时候,每插入一个节点时它的插入位置是一定的,要么插在最大的比它小的数的右边,要么插在最小的比它
大的数左边,用线段树维护最大最小值就可以了;也可以用set+map模拟建树的过程; AC代码:
#include <bits/stdc++.h>
/*
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
*/
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
const LL mod=1e9+;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const int N=1e5+;
int n,l[N],r[N],f[N];
struct Tree
{
int l,r,mmin,mmax;
}tree[*N];
void pushup(int node)
{
tree[node].mmin=min(tree[*node].mmin,tree[*node+].mmin);
tree[node].mmax=max(tree[*node].mmax,tree[*node+].mmax);
}
void build(int node,int L,int R)
{
tree[node].l=L;
tree[node].r=R;
tree[node].mmax=;
tree[node].mmin=inf;
if(L==R)return ;
int mid=(L+R)>>;
build(*node,L,mid);
build(*node+,mid+,R);
}
void update(int node,int pos)
{
// cout<<tree[node].l<<" "<<tree[node].r<<" "<<pos<<"@"<<"\n";
if(tree[node].l==tree[node].r&&tree[node].l==pos)
{
tree[node].mmax=tree[node].mmin=pos;
return ;
}
int mid=(tree[node].l+tree[node].r)>>;
if(pos<=mid)update(*node,pos);
else update(*node+,pos);
pushup(node);
}
int query(int node,int L,int R,int flag)
{
if(L<=tree[node].l&&R>=tree[node].r)
{
if(flag)return tree[node].mmax;
else return tree[node].mmin;
}
int mid=(tree[node].l+tree[node].r)>>;
if(R<=mid)return query(*node,L,R,flag);
else if(L>mid)return query(*node+,L,R,flag);
else
{
if(flag)return max(query(*node,L,mid,flag),query(*node+,mid+,R,flag));
else return min(query(*node,L,mid,flag),query(*node+,mid+,R,flag));
}
}
struct Po
{
int a,pos,num;
}po[N];
int cmp1(Po x,Po y)
{
return x.a<y.a;
}
int cmp2(Po x,Po y)
{
return x.pos<y.pos;
}
int main()
{
scanf("%d",&n);
build(,,n);
Riep(n)
{
scanf("%d",&po[i].a);
po[i].pos=i;
}
sort(po+,po+n+,cmp1);
Riep(n)po[i].num=i,f[i]=po[i].a;
sort(po+,po+n+,cmp2);
update(,po[].num);
for(int i=;i<=n;i++)
{
int s=query(,,po[i].num,);
if(s==||(s!=&&r[s]))
{
s=query(,po[i].num,n,);
l[s]=po[i].num;
}
else
{
r[s]=po[i].num;
}
update(,po[i].num);
printf("%d ",f[s]);
} return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss)); typedef long long LL; template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
} const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=1e9+10;
const int N=1e5+10;
const int maxn=1e3+20;
const double eps=1e-12; set<int>s;
map<int,int>le,ri;
set<int>::iterator it;
int main()
{
int n,x;
read(n);
read(x);s.insert(x);
For(i,2,n)
{
read(x);
it=s.lower_bound(x);
int pos=*it;
if(le[pos]==0&&it!=s.end())le[pos]=x;
else
{
it--;
pos=*it;
ri[pos]=x;
}
s.insert(x);
printf("%d ",pos);
}
return 0;
}
codeforces 675D D. Tree Construction(线段树+BTS)的更多相关文章
- 【Codeforces 675D】Tree Construction
[链接] 我是链接,点我呀:) [题意] 依次序将数字插入到排序二叉树当中 问你每个数字它的父亲节点上的数字是啥 [题解] 按次序处理每一个数字 对于数字x 找到最小的大于x的数字所在的位置i 显然, ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- Educational Codeforces Round 6 E. New Year Tree dfs+线段树
题目链接:http://codeforces.com/contest/620/problem/E E. New Year Tree time limit per test 3 seconds memo ...
- Codeforces 620E New Year Tree(线段树+位运算)
题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...
- Codeforces 620E New Year Tree【线段树傻逼题】
LINK 题目大意 给你一棵树 让你支持子树染色,子树查询颜色个数,颜色数<=60, 节点数<=4e5 思路 因为颜色数很少,考虑状态压缩变成二进制 然后直接在dfs序上用线段树维护就可以 ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
随机推荐
- 常见Java基础知识(较长)
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象, ...
- Oracle 建表常用数据类型的详解
创建表时,必须为表的各个列指定数据类型.如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存.如为学生指定出生日期为“1980-13-31”. 在Oracle中,常见的数据类型有: 字符串:字符 ...
- Apache与Tomcat 区别联系
Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...
- 【转】struct和typedef struct
原文:http://www.cnblogs.com/qyaizs/articles/2039101.html 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用type ...
- 从零开始学android开发-adt-bundle-eclipse下的修改android app名称
eclipse中,打开项目根目录中的AndoirManifest.xml文件,找到如下内容 <application android:allowBackup="true" a ...
- LFS7.4编译笔记(1)
由于第一次编译,花了不少时间,也不知道能不能成功,所以就没有记笔记,现在重新编译一次,这次不装U盘而是装到我的移动硬盘上面.步骤差不多,因为我感觉硬盘的速度会比U盘快. 至于LFS的优点,我就不多说了 ...
- 【JavaScript】n++ VS ++n
var n = 1; console.log(n++);--------------->表达式的值为 1; n的值为2 console.log(++n);--------------->表 ...
- jquery easyui from 表单返回乱码!
如果用easyui的form进行提交,必须在<form>标签中加入属性method="post",即<form method="post"&g ...
- IOS试题收集1
IOS试题收集1 1.Objective C中有多继承吗?没有的话用什么代替? Protocol 2.Objective C中有私有方法吗?私有变量呢? OC类里面只有静态方法和实例方法这两种,@pr ...
- andorid
js内存泄露 三分面加七分水 —— 十分糊涂 膝盖上打瞌睡 —— 自己靠自己 不当家,不知柴米贵:不生子,不知父母恩. 水落现石头,日久见人心. sqllite http://wenku.baidu. ...