当前位置: 代码迷 >> 综合 >> hihocoder #1105 : 题外话·堆 - (大根堆)
  详细解决方案

hihocoder #1105 : 题外话·堆 - (大根堆)

热度:29   发布时间:2024-01-12 15:24:59.0

题目链接:http://hihocoder.com/problemset/problem/1105

题意有两种操作,1.插入一个数据,2.取出最大的数据

解析:模板题,用大根堆解决:

//大根堆,每个节点的权值都比它的左右子节点的权值大的话,根节点值最大,但不能保证子节点的有序
#include <iostream>
#include <cstdio>
using namespace std;
#define M 100005
int heap[M],len;
void push(int x)
{//第一个元素的下标为1int i=++len;while(i>1){int p=i/2; //p为i的父节点if(heap[p]>=x)break;heap[i]=heap[p];i=p;}heap[i]=x;
}
int pop()
{int ret=heap[1];  //ret=最大值根节点int x=heap[len--];//x=最后一个节点int i=1;while(2*i+1<=len) //这是一个将大的节点值往上提的过程,这样的话如果i没有右节点但是有左节点,忽略了i的比较{int a=2*i,b=2*i+1;if(heap[b]>heap[a])//使a指向值较大的子节点a=b;if(x>=heap[a])break;heap[i]=heap[a];i=a;}heap[i]=x;return ret;
}
int main()
{int T,a;char op;len = 0;scanf("%d",&T);while(T--){getchar();scanf("%c",&op);if(op=='A'){scanf("%d",&a);push(a);}else{printf("%d\n",pop());}for(int i=1;i<=len;i++)cout<<heap[i]<<" ";cout<<endl;}return 0;
}


  相关解决方案