Codefroces #353(Div.2) Tree Construction
来源:互联网 发布:ps3真高达无双淘宝 编辑:程序博客网 时间:2024/06/03 14:17
今天模拟了一场CF比赛第四题没有做出来,赛后想了好久才想出来了,题意是给你n个互不相等的数,按照所给的数建立一个二叉排序树,要求输出n-1个数,从输入的第二个数开始所有数的父节点。这题咋一看要建立一个二叉排序树,然后查找结点的父节点,但是仔细想下就会发现还是有问题的,假如给出的数据建立的是一颗只有左子树或者只有右子树的二叉排序数,查找的时间复杂度为O(n*n),而题目中的n<100000,这显然会超时,这种方法就放弃了。
然后又自己写了一些数据在纸上画了下,分析发现一个数的父节点一定是在该节点之前出现并且大于value[n]且最接近value[n],或者小于value[n]也最接近于value[n],一定是这两种中的一种,那么问题又来了,到底是哪一种呢?继续进行分析,要分为三种情况分析:
- 假设当前节点k之前没有大于当前节点的值,此时当前节点的父节点为小于value[k]并且最接近于value[k],并且我们要标记小于value[k]并且最接近于value[k]的值有右子树,如下图1所示。
- 假设当前节点k之前没有小于当前节点的值,此时当前节点的父节点为大于value[k]并且最接近于value[k],并且我们要标记大于value[k]并且最接近于value[k]的值有做子树,入下图2所示。
图1图2
3. 最后一种情况就是两种可能都出现,这时我们就要用到前面所记录的一些节点是否有左、右子树这个条件了,如果k节点中小于value[k]最接近于value[k]的值没有右子树那么这个数就是value[k]的父节点,否则看大于value[k]最接近于value[k]的值有没有左子树,如果没有则这个数的左子树就是value[k],以上两种情况一定有一种满足题意!
第一次RE了,因为标记每个出现的节点的左、右子树时节点的权值是整型,后来改用map过了,注意因为n<100000,所以如果每次直接暴力找第一个大于这个数的值的时候时间复杂度为O(n*n),显然不行,就必须用到set容器来解决这个问题,set自带二分查找函数。以上就是我对于这题的看法。
#include <iostream>#include <cstdio>#include <set>#include <map>#include <cstring>using namespace std;set<int>s;set<int>::iterator it;map<int, int>lchild;map<int, int>rchild;const int N = 100005;int data[N];int result[N];int main(){ int n; while(cin>>n) { s.clear(); lchild.clear(); rchild.clear(); for(int i=0; i<n ;i++) cin>>data[i]; s.insert(data[0]); for(int i=1; i<n; i++) { int MIN, MAX; it = s.lower_bound(data[i]); if(it==s.end()) { it--; result[i] = *it; rchild[*it] = 1; } else if(it == s.begin()) { result[i] = *it; lchild[*it] = 1; } else { MAX = *it; MIN = *(--it); if(!rchild[MIN]) { rchild[MIN] = 1; result[i] = MIN; } else { lchild[MAX] = 1; result[i] = MAX; } } s.insert(data[i]); } for(int i=1; i<n; i++) cout<<result[i]<<" "; cout<<endl; } return 0;}
1 0
- Codefroces #353(Div.2) Tree Construction
- Codeforces Round #353 (Div. 2) D. Tree Construction
- Codeforces Round #353 (Div. 2)D. Tree Construction
- Codeforces Round #353 (Div. 2) D. Tree Construction (BST)
- Codeforces Round #353 (Div. 2) D. Tree Construction
- Codeforces Round #353 (Div. 2) D. Tree Construction __ Binary Search Tree
- Codeforces Round #353 (Div. 2) D. Tree Construction (二叉搜索树+set)
- Codeforces Round #353 (Div. 2) D. Tree Construction (构造二叉搜索树)
- Codeforces Round #353 (Div. 2) D. Tree Construction (BST询问父亲节点)
- codeforces 353 div2 Tree Construction
- Tree Construction
- codefocres#353-D - Tree Construction-构造
- Codeforces Round #353 (Div. 2) D. Tree Construction(每个点按照二叉树排序树的插入插入到树中,问最后每个点的父亲节点的值是多少)
- hdu 3516 Tree Construction
- HDOJ 3516 Tree Construction
- hdu3516 Tree Construction
- codeforces round353 tree construction
- 二叉排序树--cf675d Tree construction
- 动态规划详解
- 面试遇到数据库题目总结
- 按两次返回键退出程序
- JAVA队列之优先队列
- 关于登录模块的心得体会
- Codefroces #353(Div.2) Tree Construction
- 强悍的 Linux —— 强悍的 vim (二)
- Comet4J 相关
- Ubuntu 16.04 LTS的这十项新功能,每个Ubuntu用户必须要知道!
- UIPickerView的使用
- Servlet运行机制与生命周期
- 控制台里打印view的层级 在控制台里打印controller的层级 及其他技巧
- 打包报错
- poj 2240 Arbitrage