优先队列 (干掉手写堆 呜呜呜~~)

优先队列

优先队列中的元素会按某种优先级依次出队列,即可实现按此优先级排序,时间复杂度和堆排序差不多

 

优先队列的头文件   #include

 

优先队列的定义式

1. priority_queue q; 默认优先级从到大到小  

     priority_queue,greater > q; 优先级从小到大

2. 除此之外我们还可以选择重载运算符  (用于结构体  ,无法直接定义)

#include
#include
#include
using namespace std;
struct pro
{
	int a;
	int b;//优先级 
};
priority_queue q;//默认大到小 
bool operator < (const pro x,const pro y)//重载小于号  变小到大 
{
	return x.b>y.b; 
} 

 

优先队列的操作

  1. 插入                            q.push(x);
  2. 查询队首                    a=q.top( );
  3. 删除队首                    q.pop( );
  4. 是否为空                    if( q.empty( ) )  //如果为空返回true;
  5. 返回队的大小            l=q.size( );

 

洛谷P3378 【模板】堆

#include
#include
#include
#include
#include
#include
#include
using namespace std;
priority_queue,greater > q; 
int main()
{
    int n; cin>>n; 
	int k,x;
    while(n--)
    {
        scanf("%d",&k);
        
        if(k==1) 
        {
        	scanf("%d",&x);
        	q.push(x);
        }
        
        if(k==2)
        {
            cout<

郑重纪念一下我的手写堆 默哀0.000001s

#include
#include
#include
#include
#include
#include
using namespace std;

struct dui//xiao
{
    int a[1000050];
    int n;
    void up(int i)
    {
        while(i>1)
        {
            int j=i/2;
            if(a[i]=1;i--)   down(i);
    }
}q;



int main()
{
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++) 
    {
    	int k;
    	scanf("%d",&k);
    	if(k==1)  
    	{
    		int l;
    		scanf("%d",&l);
    		q.Push(l);
    	}
    	else if(k==2)  printf("%d\n",q.Top());
    	else if(k==3)  q.Pop();
    }
    
    
    
    return 0;
}

 

你可能感兴趣的:(优先队列 (干掉手写堆 呜呜呜~~))