洛谷题解——【模板】堆

题目链接:【模板】堆

【模板】堆

题目描述

给定一个数列,初始为空,请支持下面三种操作:

  1. 给定一个整数 x,请将 x 加入到数列中。
  2. 输出数列中最小的数。
  3. 删除数列中最小的数(如果有多个数最小,只删除 1 个)。

输入格式

第一行是一个整数,表示操作的次数 n
接下来 n 行,每行表示一次操作。每行首先有一个整数 op 表示操作类型。

  • op=1,则后面有一个整数 x,表示要将 x 加入数列。
  • op=2,则表示要求输出数列中的最小数。
  • op=3,则表示删除数列中的最小数。如果有多个数最小,只删除 1 个。

输出格式

对于每个操作 2,输出一行一个整数表示答案。

样例 #1

样例输入 #1

51 21 5232

样例输出 #1

25

提示

【数据规模与约定】

  • 对于 30% 的数据,保证 n15
  • 对于 70% 的数据,保证 n104
  • 对于 100% 的数据,保证 1n1061x<231op{1,2,3}

这道题考察的是小顶堆的使用

方法一:暴力求解(代码这里就不写了)

方法二:手写堆

#include<bits/stdc++.h>using namespace std;long long n,heap[10000000],t=0;void sup(int i){	int flag=0;	if(i==1)return ;	while(i!=1&&flag==0){		if(heap[i]<heap[i/2])			swap(heap[i],heap[i/2]);		else			flag=1;		i/=2;	}}void sdown(int i){	int l,f=0;	while(i*2<=t&&f==0){		if(heap[i]>heap[i*2])			l=i*2;		else			l=i;		if(i*2+1<=t){			if(heap[l]>heap[i*2+1])				l=2*i+1;		} 		if(l!=i){			swap(heap[l],heap[i]);			i=l;		}else			f=1;	}}void del(int i){	heap[i]=heap[t];	t--;	sdown(i);}int main(){	cin>>n;	int op;	for(int i=1;i<=n;i++){		cin>>op;		if(op==1){			cin>>heap[++t];			sup(t);		}		if(op==2){			cout<<heap[1]<<endl;		}		if(op==3){			del(1);		}	}	return 0;}

方法三:STL优先队列

#include<bits/stdc++.h>using namespace std;int n,x;int main(){	priority_queue <int,vector<int>,greater<int> > q;	cin>>n;	int op;	for(int i=1;i<=n;i++){		cin>>op;		if(op==1){			cin>>x;			q.push(x);		}		if(op==2){			cout<<q.top()<<endl;		}		if(op==3){			q.pop();		}	}	return 0;}

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYidzcLe' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片