二叉堆模板(备用)

xiaoxiao2021-02-28  131

//二叉堆 #include <cstdio> #include <iostream> using namespace std; int read() { int num1=0,fu=1; char ch=getchar(); if(ch=='-')fu=-1; while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9') { num1=num1*10+ch-'0'; ch=getchar(); } return num1*fu; } int a[100004]={0};//堆 int n; void put(int); void get(int); int min1(int ,int); int main() { n=read(); for(int i=1;i<=n;i++) { a[i]=read(); put(i); } int m=read();//修改次数 for(int i=1;i<=m;i++) { bool bo=read();// bo=1时添加新元素,bo=0时输出并删除最小元素 if(bo) { int num=read(); a[n++]=num; put(n); } else { printf("%d\n",a[1]); a[1]=a[n--]; get(1); } } return 0; } void put(int i) { if(a[i]>=a[i/2])return;//已包括i=1 else { swap(a[i],a[i/2]); put(i/2); } } void get(int i) { if(i*2>n)return; else { int t=min1(i*2,i*2+1); if(a[i]<=a[t])return; else { swap(a[i],a[t]); get(t); } } } int min1(int z,int x) { if(x>n)return z; else { return a[z]<a[x]?z:x; } }
转载请注明原文地址: https://www.6miu.com/read-25850.html

最新回复(0)