# priority_queue

## 实现细节

最终仅需要提交 `priority_queue.hpp` 的内容。

你需要完成的内容：

+ 构造函数（两种）
+ 析构函数
+ 赋值重载
+ 获得队首元素 `top`
+ 元素入队 `push`
+ 队首元素出队 `pop`
+ 队列大小 `size`
+ 判断队列是否为空 `empty`
+ 队列合并 `merge`

具体细节可以查看下发的 `priority_queue.hpp` 框架。

**注意：**

- 你能使用的头文件仅限于下发框架中提供的头文件；
- `merge` 复杂度不能超过 $O(\log n)$，这意味着你可能需要写可并堆；
- 有测试内存泄漏的数据点；
- Compare 对某些特定的数据可能会抛出异常（exception），这时你应该终止正在进行的操作并将堆恢复原样。

**另外，A 班同学需要完成特定堆的复杂度分析报告，要求如下：**
- 请在**配对堆**，**斜堆**，**二项堆**中选择一个来完成；
- 对于每个操作，分析它的时间复杂度；涉及到均摊复杂度的，请具体分析；
- 请自行根据需要来阐明堆的一些定义和性质；
- 如果选择二项堆，你需要说明 `push` 的均摊复杂度是 $O(1)$。

## 分数构成

正常情况下，在 OJ 上通过测试数据可以获得 80% 的分数，CR 占 20% 的分数。

如果在 CR 时，发现有任何违规行为（包括但不限于使用其它头文件、使用非常规方法通过测试点以及 `merge` 复杂度超过 $O(\log n)$），原则上你的最终得分将为 0 分。

## 截止日期

3 月 24 日（第五周周日）18:30 前