手写堆
Posted hhyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写堆相关的知识,希望对你有一定的参考价值。
1 for(int i=1;i<=n;i++) 2 cin>>h[i]; 3 size=n; 4 for(int i=n/2;i;i--) 5 down(i); 6 //建堆,根据完全二叉树的性质,n/2后的都是叶子结点,只需要把所有的根结点从后往前down一遍就完成了堆的建立 7 8 9 //小根堆 10 int h[N]; 11 int idx[N];//存的是第k个插入的点在堆中的位置,即下标 12 int no[N];//存的是下标为k的点是第几个插入的 13 int size,no_;//size为下标,no为第几个插入的编号 14 inline void heap_swap(int a,int b){ 15 swap(idx[no[a]],idx[no[b]]); 16 swap(no[a],no[b]); 17 swap(h[a],h[b]); 18 } 19 inline void up(int u){ 20 while(u/2 && h[u]<h[u/2]){ 21 heap_swap(u,u/2); 22 u>>=1; 23 } 24 } 25 inline void down(int u){ 26 int t=u; 27 if(u*2<=size && h[u*2]<h[t]) 28 t=u*2; 29 if(u*2+1<=size && h[u*2+1]<h[t]) 30 t=u*2+1; 31 if(u!=t){ 32 heap_swap(u,t); 33 down(t); 34 } 35 } 36 inline void insert(){ 37 int x; 38 cin>>x; 39 no_++; 40 h[++size]=x; 41 idx[no_]=size; 42 no[size]=no_; 43 up(size); 44 } 45 inline void poptop(){ 46 heap_swap(1,size); 47 size--; 48 down(1); 49 } 50 inline void remove(int p){ 51 heap_swap(p,size--); 52 up(p),down(p); 53 }
以上是关于手写堆的主要内容,如果未能解决你的问题,请参考以下文章