用数组模拟堆代码模板

用数组模拟堆代码模板_第1张图片

//模拟堆,一般用不到,面试喜欢问
#include
using namespace std;
const int N = 1e5 + 9;
//ph[]中下标为第几个数,值为h[]中的下标
//hp[]中下标与h[]下标相同,值为第几个数
int h[N], hp[N], ph[N], Size, n, x, k, idx;
string op;

void heap_swap(int a, int b)
{
	swap(h[a], h[b]);
	swap(hp[a], hp[b]);
	swap(ph[hp[a]], ph[hp[b]]);
}

void down(int u)
{
	int t = u;                                    
	if (2 * u <= Size && h[u * 2] < h[t]) t = u * 2;
	if (2 * u + 1 <= Size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
	if (t != u)                             
	{
		heap_swap(t, u);               
		down(t);                          
	}
}

void up(int u)
{
	int t = u;
	if (u / 2 > 0 && h[u / 2] > h[t]) t = u / 2;
	if (t != u)
	{
		heap_swap(t, u);
		up(t);
	}
}

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n;
	while (n--)
	{
		cin >> op;
		if (op == "I")
		{
			cin >> x;
			h[++Size] = x;
			hp[Size] = ++idx;
			ph[idx] = Size;
			up(Size);
		}
		else if (op == "PM")
		{
			cout << h[1] << '\n';
		}
		else if (op == "DM")
		{
			heap_swap(1, Size--);
			down(1);
		}
		else if (op == "D")
		{
			//依旧需要和最后一个元素交换
			cin >> k;
			int	u = ph[k];//找到第k个数所h[]中的下标位置
			heap_swap(ph[k], Size--);
			//这俩只会执行一个
			up(u);
			down(u);
		}
		else
		{
			cin >> k >> x;
			h[ph[k]] = x;
			//修改后上浮或者下沉,回到正确位置
			up(ph[k]);
			down(ph[k]);
		}
	}
	return 0;
}

你可能感兴趣的:(算法,c++)