TTTTTTTTTTTT Codeforces Round #353 (Div. 2) D 平衡二叉树的set模拟 没有很懂

题意:给你n个数字,第一个点作为根节点,然后每次插入一个节点,构建一棵平衡二叉树,并输出插入节点后该节点的父节点的值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int  inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=100000;

set<int> s;
map<int,int> l;
map<int,int> r;

int main()
{
    int n,v;
    while(~scanf("%d",&n))
    {
        s.clear();
        l.clear();
        r.clear();

        scanf("%d",&v);
        s.insert(v);
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&v);
            set<int>::iterator it=s.lower_bound(v);
            if(it==s.end())
            {
               it--;
               r[*it]=v;
               printf("%d ",*it);
               s.insert(v);
               continue;
            }

            if(l[*it]==0)
                l[*it]=v;
            else{
                it--;
                r[*it]=v;
            }
            printf("%d ",*it);
            s.insert(v);
        }
        printf("
");
    }
    return 0;
}

先前写的爆内存了,,因为最多可以2^1e5,,所以应该改成map,,不过用set模拟BST不太懂啊、、。。链接

  

原文地址:https://www.cnblogs.com/smilesundream/p/5524047.html