题意:模拟一颗n(2 <= n <= 100000)个点的二叉搜索树的插入过程,输出最终每个点父亲的权值。
分析:
昨天比赛的第三题,当时写的暴力混了80分,gzz神犇线段树A过,无限orz中...
这题其实用set就可以做(感觉zrt特别喜欢用set,不过set的确是一个非常好用的工具),每个点的父亲就是在他前面的点中比他大的最小的和比他小的最大的中插入顺序更靠后的那个(这句话说起来真别扭...)
#include<cstdio>
#include<set>
#define p std::pair<int,int>
#define m(a,b) std::make_pair(a,b)
int n,x; std::set<p> s;
int main(){
scanf("%d%d",&n,&x); s.insert(m(x,1));
for(int i=2;i<=n;i++){
scanf("%d", &x);
std::set<p>::iterator k=s.lower_bound(m(x,i)), j=k--;
if((*k).second<(*j).second) printf("%d ",(*j).first); else printf("%d ",(*k).first);
s.insert(m(x,i));
}
return 0;
}