百练 实现堆结构

来源:互联网 发布:网络诈骗报警流程 编辑:程序博客网 时间:2024/06/02 06:47
//百练 实现堆结构 #include <iostream>#include <cstdio>#include <cstring>long heap[100010];long sz = 0;void insert(long x){//插入一个新元素,先将其放置最后端,逐步向上提升 long i = sz++;while(i>0){//p为父节点 long p = (i-1)/2;//如果父节点值大于x,则将新插入结点上提 if(heap[p]>x){heap[i]=heap[p];i = p;}else break;}heap[i]=x;}long pop(){long ans = heap[0];printf("%ld\n",ans);//将末尾结点的值提上来 long x=heap[--sz];//从根节点开始比对 long i = 0;while(2*i+1<sz){long left = 2*i+1;long right = 2*i+2;if(right<sz&&heap[right]<heap[left]){//注意left的变化 left = right;}if(heap[left]>=x) break;heap[i] = heap[left];i = left;}heap[i] = x;}using namespace std;int main(){long t;cin>>t;while(t--){sz = 0;memset(heap,0,sizeof(heap));long n;cin>>n;while(n--){int type;long num;scanf("%d",&type);if(type==1) {scanf("%ld",&num);insert(num);} else{pop();}}}}