手写大根堆与小根堆

chen_zhe 沙雕 2020-08-11 15:32:15 2020-08-13 15:30:25 0

其实STL中的priority_queue已经提供了这个,但是据洛谷某个叫noip的用户大佬说最近NOIP中卡常数,而STL中的常数十分糟糕,不卡常的题也有可能TLE,所以手写堆还是很有必要的……

less_heap为大根堆,heap为小根堆,make是建堆函数,堆定义后必须马上调用init,用heap<堆中元素类型名> 堆的名字定义,如果是自己的结构体类型需要重载小于和大于运算符(不会?看这里),其他的自行阅读程序

上代码:

#include <algorithm>
#include <queue>

using namespace std;

template <typename T>
class heap {
	
private:
	vector<T> a;
	int pa, son;
	
public:
	inline void init()
	{
		a.push_back(0);
	}
	inline void pop()
	{
		a[1] = a.back(), pa = 1, son = 2;
		a.pop_back();
		while (son < a.size())
		{
			if (a[son] < a[pa] && a[son + 1] >= a[son]) swap(a[son], a[pa]);
			else if (a[++ son] < a[pa]) swap(a[son], a[pa]);
			else break;
			pa = son, son <<= 1;
		}
		if (a[son] < a[pa]) swap(a[son], a[pa]);
	}
	inline void push(T x)
	{
		a.push_back(x);
		son = a.size() - 1, pa = son >> 1;
		while (pa >= 1)
		{
			if (a[pa] > a[son]) swap(a[pa], a[son]);
			else break;
			son = pa, pa >>= 1;
		}
	}
	inline T top()
	{
		return a[1];
	}
	inline int size()
	{
		return a.size() - 1;
	}
	inline bool empty()
	{
		return !(a.size() - 1);
	}
	inline void make(int *begin, int *end)
	{
		for (int *it = begin; it <= end; it ++)
		a.push_back(*it);
		make_heap(a.begin() + 1, a.end(), greater<int>());
	}
	inline void operator = (const heap h)
	{
		a.clear();
		for (int i = 0; i < h.a.size(); i ++)
		a.push_back(h.a[i]);
	}
};

template <typename T>
class less_heap {
	
private:
	vector<T> a;
	int pa, son;
	
public:
	inline void init()
	{
		a.push_back(0);
	}
	inline void pop()
	{
		a[1] = a.back(), pa = 1, son = 2;
		a.pop_back();
		while (son < a.size())
		{
			if (a[son] > a[pa] && a[son + 1] <= a[son]) swap(a[son], a[pa]);
			else if (a[++ son] > a[pa]) swap(a[son], a[pa]);
			else break;
			pa = son, son <<= 1;
		}
		if (a[son] > a[pa]) swap(a[son], a[pa]);
	}
	inline void push(T x)
	{
		a.push_back(x);
		son = a.size() - 1, pa = son >> 1;
		while (pa >= 1)
		{
			if (a[pa] < a[son]) swap(a[pa], a[son]);
			else break;
			son = pa, pa >>= 1;
		}
	}
	inline T top()
	{
		return a[1];
	}
	inline int size()
	{
		return a.size() - 1;
	}
	inline bool empty()
	{
		return !(a.size() - 1);
	}
	inline void make(int *begin, int *end)
	{
		for (int *it = begin; it <= end; it ++)
		a.push_back(*it);
		make_heap(a.begin() + 1, a.end());
	}
	inline void operator = (const less_heap h)
	{
		a.clear();
		for (int i = 0; i < h.a.size(); i ++)
		a.push_back(h.a[i]);
	}
};
{{ vote && vote.total.up }}

共 6 条回复

chen_zhe 沙雕

fzh 终于承认自己很强了!自己%自己!!!Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz

Duke

zqs 终于承认自己很强了!自己%自己!!!Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz Orz

chen_zhe 沙雕

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

root 站长

%%%%%%%%%%%%%%%%%%%%%%%%

Duke

%%%

Duke

%%%