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("\n");
    }
    return 0;
}

 

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

 

  

posted @ 2016-05-24 16:59  快点说我帅  阅读(196)  评论(0编辑  收藏  举报