zoukankan      html  css  js  c++  java
  • [平衡树] mingap

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 18  解决: 9

    题目描述

    实现一种数据结构,维护以下两个操作: 
    (1) :加入元素 ; 
    (2) :输出当前表中相差最小的两个元素的差。 
    一开始表为空,插入次数不超过 50000 ,插入的数字不超过 220且都为正数,如果要插入的是前面已有的元素,则不处理。

    输入

    第一行为操作数,以下每行一种操作

    输出

    对于每个 的操作,输出对应的结果,每行一个数。

    样例输入

    5
    I 1
    I 10
    M
    I 6
    M

    样例输出

    9
    4
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n;
    struct node
    {
        int key;
        node *child[2];
    }bst[50001],*root,*pos;
    queue<node*>mem;
    void newnode(node* &r,int key)
    {
        if(mem.empty())r=pos++;
        else r=mem.front(),mem.pop();
        r->key=key;
        r->child[0]=r->child[1]=NULL;
    }
    void insert(node* &r,int key)
    {
        if(r==NULL)newnode(r,key);
        else insert(r->child[r->key<key],key);
    }
    bool exist(node* &r,int key)
    {
        if(r==NULL)return false;
        if(r->key>key)return exist(r->child[0],key);
        else return (r->key==key)||exist(r->child[1],key);
    }
    int mmin(node* &r,int key)
    {
        if(r==NULL)return key;
        if(r->key<=key)return mmin(r->child[1],key);
        else
        {
            int s=mmin(r->child[0],key);
            if(s==key)return r->key;
        }
    }
    int mmax(node* &r,int key)
    {
        if(r==NULL)return key;
        if(r->key>=key)return mmax(r->child[0],key);
        else
        {
            int s=mmax(r->child[1],key);
            if(s==key)return r->key;
        }
    }
    int main()
    {
        root=NULL;
        pos=bst;
        int i,j,num,ans=2000000000;
        char s[2];
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%s",s);
            if(s[0]=='I')
            {
                scanf("%d",&num);
                if(i==1)
                {
                    insert(root,num);
                    continue;
                }
                if(root,exist(root,num))continue;
                int a=mmin(root,num),b=mmax(root,num);
                if(a==num)a=2000000000;if(b==num)b=2000000000;
                ans=min(ans,min(abs(num-a),abs(num-b)));
                insert(root,num);
            }
            else printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    acwing2-01背包问题
    背包问题(转载)
    考研易错点 二叉树的度和图的度
    考研易错点*s++
    考研复习易错点数组指针和指针数组
    Android Crash Learning
    Mysql5.7中的分组排序
    康师傅JVM:StringTable(十三)
    RocketMQ集群搭建
    RocketMq的单机安装
  • 原文地址:https://www.cnblogs.com/huangdalaofighting/p/6788772.html
Copyright © 2011-2022 走看看