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\n",tree.query()); } }
It is your time to fight!