00x2.堆

堆(heap),stl里的priority_queue,模板如下:

#include<iostream>
using namespace std;
//堆:完全二叉树
//小根堆:父节点<=子节点
//大根堆:父节点>=子节点
const int N = 1000010;
int a[N], cnt;

//上浮(log n)
void up(int u)
{
	//父亲比儿子大就交换
	if (u / 2 && a[u / 2] > a[u])
		swap(a[u], a[u / 2]), up(u / 2);
}

//压入(log n)
void push(int x)
{
	a[++cnt] = x;
	up(cnt);
}

//下沉(log n)
void down(int u)
{
	int v = u;
	if (u * 2 <= cnt && a[u * 2] < a[v]) v = u * 2;
	if (u * 2 + 1 <= cnt && a[u * 2 + 1] < a[v]) v = u * 2 + 1;
	if (u != v) swap(a[u], a[v]), down(v);
}


//删除(log n)
//把尾部元素移到根上,再下沉
void down(int u)
{
	a[1] = a[cnt--];
	down(1);
}
int main()
{
	...
}
posted @ 2025-06-16 19:39  _P_D_X  阅读(9)  评论(0)    收藏  举报