数据结构-大根堆小根堆模板
作者:互联网
明明用优先队列就可以了的说
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
const ll MAXN=1e18;
const int MOD=1e6;
struct Maxheap{
int cnt,date[100050];
void low(int k){//下沉
int nex=k*2,tmp=date[k];
while(nex<=cnt){
if(nex+1<=cnt&&date[nex+1]>date[nex]) ++nex;
if(tmp<date[nex]) date[k]=date[nex];
else break;
k=nex;nex*=2;
}
date[k]=tmp;
}
void up(int k){//上浮
int tmp=date[k];
while(k>1&&date[k/2]<tmp){
date[k]=date[k/2];
k/=2;
}
date[k]=tmp;
}
void insert(int elem){//插入
date[++cnt]=elem;
up(cnt);
}
void pop(){//首部删除
date[0]=date[cnt];
--cnt;
low(0);
}
void init(){//对date内部元素进行初始化
if(cnt==1) return;
int pos;
for(pos=cnt;pos>=1;--pos){
if(pos*2<=cnt) break;
}
while(pos>=1){
low(pos);
--pos;
}
}
void print(){//输出
for(int i=1;i<=cnt;++i){
cout<<date[i]<<' ';
}
cout<<'\n';
}
}maxh;
struct Minheap{
int cnt,date[100050];
void low(int k){
int nex=k*2,tmp=date[k];
while(nex<=cnt){
if(nex+1<=cnt&&date[nex+1]<date[nex]) ++nex;
if(tmp>date[nex]) date[k]=date[nex];
else break;
k=nex;nex*=2;
}
date[k]=tmp;
}
void up(int k){
int tmp=date[k];
while(k>1&&date[k/2]>tmp){
date[k]=date[k/2];
k/=2;
}
date[k]=tmp;
}
void insert(int elem){
date[++cnt]=elem;
up(cnt);
}
void pop(){
date[0]=date[cnt];
--cnt;
low(0);
}
void init(){
if(cnt==1) return;
int pos;
for(pos=cnt;pos>=1;--pos){
if(pos*2<=cnt) break;
}
while(pos>=1){
low(pos);
--pos;
}
}
void print(){
for(int i=1;i<=cnt;++i){
cout<<date[i]<<' ';
}
cout<<'\n';
}
}minh;
标签:大根堆,cnt,int,void,pos,根堆,nex,date,数据结构 来源: https://www.cnblogs.com/Flowyuan-Foreverworld/p/14643736.html