洛谷 P3378 【模板】堆
【题目描述】
给定一个数列,初始为空,请支持下面三种操作:
给定一个整数 x,请将 x 加入到数列中。
输出数列中最小的数。
删除数列中最小的数(如果有多个数最小,只删除 1 个)。
【输入格式】
第一行是一个整数,表示操作的次数 n。
接下来 n 行,每行表示一次操作。每行首先有一个整数 op 表示操作类型。
若 op = 1,则后面有一个整数 x,表示要将 x 加入数列。
若 op = 2,则表示要求输出数列中的最小数。
若 op = 3,则表示删除数列中的最小数。如果有多个数最小,只删除 1 个。
【输出格式】
对于每个操作 2,输出一行一个整数表示答案。
【输入输出样例】
输入
5
1 2
1 5
2
3
2
输出
2
5
【AC代码】
手动建堆调整
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int heap[maxn],n=0;//最小堆(下标从1开始)
void downAdjust(int low,int high)//向下调整
{
int i=low,j=i*2;
while(j<=high)
{
if(j+1<=high&&heap[j+1]<heap[j])
j++;
if(heap[j]<heap[i])
{
swap(heap[j],heap[i]);
i=j;
j*=2;
}
else
break;
}
}
void createHeap()//建堆
{
for(int i=n/2;i>=1;i--)
downAdjust(i,n);
}
void deleteTop()//删除堆顶元素
{
heap[1]=heap[n--];
downAdjust(1,n);
}
void upAdjust(int low,int high)//向上调整
{
int i=high,j=i/2;
while(j>=low)
{
if(heap[j]>heap[i])
{
swap(heap[j],heap[i]);
i=j;
j/=2;
}
else
break;
}
}
void insert(int x)//插入元素
{
heap[++n]=x;
upAdjust(1,n);
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t,a,b;
cin>>t;
while(t--)
{
cin>>a;
if(a==1)
{
cin>>b;
insert(b);
}
if(a==2)
cout<<heap[1]<<endl;
if(a==3)
deleteTop();
}
return 0;
}
STL heap
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int heap[maxn],n=0;//最小堆(下标从1开始)
void deleteTop()//删除堆顶元素
{
pop_heap(heap+1,heap+1+n,greater<int>());
n--;
}
void insert(int x)//插入元素
{
heap[++n]=x;
push_heap(heap+1,heap+1+n,greater<int>());
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t,a,b;
cin>>t;
while(t--)
{
cin>>a;
if(a==1)
{
cin>>b;
insert(b);
}
if(a==2)
cout<<heap[1]<<endl;
if(a==3)
deleteTop();
}
return 0;
}
对于这道题,也可以直接用优先队列
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t,a,b;
priority_queue<int,vector<int>,greater<int>> q;
cin>>t;
while(t--)
{
cin>>a;
if(a==1)
{
cin>>b;
q.push(b);
}
if(a==2)
cout<<q.top()<<endl;
if(a==3)
q.pop();
}
return 0;
}