|
板凳
楼主 |
发表于 2020-3-23 22:34:25
|
只看该作者
- #include <bits/stdc++.h>
- using namespace std;
- const int mm=1000100;
- int a[mm],tot,x,n;
- void ArrayPr()
- {
- for(int i=1; i<=tot; i++) cout<<setw(3)<<a[i];
- cout<<endl;
- }
- void pushup(int x) /// 把a(x)向上调整到合适的位置
- {
- if (x==1) return ;
- int y=x/2; ///x的儿子
- if (a[y]>a[x])
- {
- swap(a[x],a[y]); ///交换一下
- pushup(y);
- }
- }
- void pushdown(int x) /// 把a(x)向下调整到合适的位置
- {
- if (2*x>tot) return ;/// 已经是叶子
- int y,yl=x*2,yr=x*2+1;
- if (yr>tot) y=yl;///没有右儿子那就只能看左儿子了
- else if (a[yl]>a[yr]) y=yr;else y=yl;///选择左右儿子的较小
- if (a[x]>a[y]) ///和最小的儿子交换
- {
- swap(a[x],a[y]);
- pushdown(y);
- }
- }
- int main()
- {
- cin>>n;
- tot=0;
- int opt,x;
- while (n--)
- {
- cin>>opt;
- if (opt==1)
- {
- cin>>x;
- a[++tot]=x;
- pushup(tot);
- }
- if (opt==2) cout<<a[1]<<endl;
- if (opt==3)
- {
- swap(a[1],a[tot]);
- tot--;
- pushdown(1);
- }
- ///ArrayPr();
- }
- return 0;
- }
- /*
- 10
- 50 25 75 18 38 66 80 10 16 11
- */
复制代码 |
|