这个题目的构造方法应该还算是很好想的,先给a按照从小到大排序,然后按顺序插入数据,构造一棵二叉查找树,而且50000的数据,nlogn的做法,应该还是很好的。不过这个题目的编码比想象中要麻烦一点,并且编码完成后居然返回了一个tle。
表示不能理解,生成了一个大数据后,发现如果排序后k也有序,那么就会二叉树退化,n*n的复杂度。简单画画图可以找到一个优化,先找要插入数据的后继或者前驱,然后从哪个位置开始插入,那么可以大大稳定复杂度。找这个东西的工作就交给set来完成即可。
#include#include #include #include #include using namespace std;const int maxn=5e4+9;int lon,f[maxn];struct D{ int a,k,id; bool operator <(const D & xx) const { return k s;int maxm;void insert(int t){// cout< < data[maxm].k) { root=f[data[maxm].id]; maxm=t; } else root=f[s.lower_bound(data[t])->id]; } else { root=1; maxm=1; } while(tr[root].id!=0) {// cout< <