堆模板
【emmm】
堆其实就是一个完全二叉树:叶子节点都在最后两层且集中在左侧。大(小)根堆的定义就是:每一个节点的权值大于等于(小于等于)其左右儿子(若存在)。
支持的操作有:
插入
删除(根节点或者非根节点)
查询根的权值
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 int heap[100010],tot; 4 void up(int p) 5 { 6 while(p>1) 7 if(heap[p]>heap[p/2]) 8 swap(heap[p],heap[p/2]), p/=2; 9 else break; 10 } 11 void Insert(int val) 12 { 13 heap[++tot]=val; 14 up(tot); 15 } 16 void down(int p) 17 { 18 int s=p*2; 19 while(s<=tot) { 20 if(s<tot&&heap[s]<heap[s+1]) s++; 21 if(heap[s]>heap[p]) swap(heap[s],heap[p]),p=s,s*=2; 22 else break; 23 } 24 } 25 void Extract() 26 { 27 heap[1]=heap[n--]; 28 down(1); 29 } 30 void Remove(int p) 31 { 32 heap[p]=heap[n--]; 33 up(p),down[p]; 34 }