HihoCoder1105 题外话·堆(基础二叉搜索树)

第1行为1个整数N,表示需要处理的事件数目。

接下来的M行,每行描述一个事件,且事件类型由该行的第一个字符表示,如果为'A',表示小Ho将一粒糖果放进了盒子,且接下来为一个整数W,表示这颗糖果的重量;如果为'T',表示小Ho需要知道当前盒子中最重的糖果的重量是多少,在知道这个值之后,小Ho会将这颗糖果从盒子中取出并吃掉。

对于100%的数据,满足1<=N<=10^5, 1<=w<=10^5。<>

对于100%的数据,满足没有2颗糖果的重量是相同的,最开始的时候小Ho的糖果盒子是空的,且每次小Ho想要取出一颗糖果的时候盒子里一定至少有一颗糖果。

输出

在一组测试数据中:

对于每个类型为'T'的时间,输出1个整数W_MAX,表示在这一时刻,盒子中最重的糖果的重量。

样例输入

5
A 77751
A 1329
A 26239
A 80317
T

样例输出

80317
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000010;
struct Node
{
     int ch[2],cnt,val;
     Node()
     {
          cnt=val=0;
          ch[0]=ch[1]=0;
     }
};
struct Tree
{
    Node S[maxn];
    int root,cnt;
    Tree()
    {
        root=cnt=0;
        S[0].val=0;
        S[0].cnt=0;
        S[0].ch[0]=S[0].ch[1]=0;
    }
    void insert(int &now,int val)
    {
        if(S[now].val==val){
            S[now].cnt++;
            return ;
        }
        if(!now){
            now=++cnt;
            S[now].val=val;
            S[now].cnt=1; 
            return ;
        }
        insert(S[now].ch[val>S[now].val],val);
    }
    int query(){
         int now=root,fa=root;
         while(S[now].ch[1]) {
              fa=now;
              now=S[now].ch[1];
         }
         S[now].cnt--;
         if(S[now].cnt==0){
                if(now!=root&&S[now].ch[0]){
                    S[fa].ch[1]=S[now].ch[0];
                    S[now].ch[0]=0;
                    S[now].ch[1]=0;
                }
                else if(now==root){
                    root=S[root].ch[0];
                }    
                else S[fa].ch[1]=0;
         }
         return S[now].val; 
    }
};
Tree tree;
int main()
{
    int n,m;
    char opt[3];
    scanf("%d",&n);
    while(n--){
        scanf("%s",opt);
        if(opt[0]=='A'){
            scanf("%d",&m);
            tree.insert(tree.root,m);
        }
        else printf("%d
",tree.query());
    }
}
原文地址:https://www.cnblogs.com/hua-dong/p/7912955.html