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()
{
...
}

浙公网安备 33010602011771号