社区讨论

44分玄关求条(前三对和后二对)

P3378【模板】堆参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjdi6fc
此快照首次捕获于
2025/11/04 00:47
4 个月前
此快照最后确认于
2025/11/04 00:47
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int main(){
	int n,op,cnt=0;
	cin>>n;
	for(int i=0,x;i<n;i++){
		cin>>op;
		if(op==1){
			cin>>x;
			cnt++;
			a[cnt]=x;
			if(cnt!=1){
				int k=cnt;
				for(;;){
					if(k==1){
						break;
					}
					if(a[k]<a[k/2]){
						swap(a[k],a[k/2]);
						k/=2;
					}else{
						break;
					}
				}  
			}
		}else if(op==2){
			cout<<a[1]<<endl;
		}else if(op==3){
			swap(a[1],a[cnt]);
			cnt--;
			int p=1;
			for(;;){
				if(p*2+1>cnt){
					if(p*2==cnt){
						if(a[p*2]>a[cnt]){
							swap(a[p*2],a[cnt]);
						}
					}
					break;
				}
				if(a[p*2]>=a[p]&&a[p*2+1]>=a[p]){
					break;
				}else{
					if(a[p*2]<=a[p*2+1]){
						swap(a[p],a[p*2]);
						p*=2;
					}else{
						swap(a[p],a[p*2+1]);
						p=p*2+1;
					}
				}
			}
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...