手写堆求调
查看原帖
手写堆求调
909367
MA_tian楼主2023/9/5 22:37

20分,一直改不对

#include<bits/stdc++.h>
using namespace std;
int a[1000005],cnt,n,x,s,u,v,g;
void up(int u){
	if(u/2&&a[u/2]<a[u]){
		swap(a[u/2],a[u]),up(u/2);
	}
}
void down(int u){
	int m=u;
	if(u*2<=cnt&&a[u*2]<a[m]){
		v=a[m*2];
	}
	if(u*2+1<=cnt&&a[u*2+1]<a[m]){
		g=a[m*2+1];
	}
	u=min(v,g);
	if(u!=m){
		down(u);
	} 
}
void add(int d){
	a[++cnt]=d;
	u=cnt;
	up(d);
}
void del(){
	a[1]=a[cnt--];
	down(1);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		if(x==1){
			cin>>s;
			add(s);
		}
		if(x==2){
			cout<<a[1]<<endl;
		}
		if(x==3){
			del();
		}
	}
	return 0;
}

rt

2023/9/5 22:37
加载中...