堆 洛谷P3378 二叉堆模板

2021-08-22 11:35:48 字數 968 閱讀 1054

如題,初始小根堆為空,我們需要支援以下3種操作:

操作1: 1 x 表示將x插入到堆中

操作2: 2 輸出該小根堆內的最小數

操作3: 3 刪除該小根堆內的最小數

支援兩種操作

1.往乙個集合加乙個數。

2.從集合中刪去乙個優先值最大的元素。

規則每個結點比兒子優先順序大。

插入規則:先插入到最後乙個結點,然後不停與父節點交換,直到到了根節點或者比父節點大。

刪除根並返回規則:(只能刪除根)先記錄根、,然後把最後乙個結點放到根的地方,然後不停地反方向交換,也就是將挪過來的結點與左右兒子比較,找到比較小的乙個,與其交換,直到到了葉子結點或者比左右兒子都小。

複雜度分析

(1).層數:logn

(2).插入或刪除:至多logn

單次操作:o(logn)

例題:合併果子 (原理是哈夫曼樹)

每個果子的代價:重量*在樹中深度

考慮這樣構造出來的樹,深度越深的結點權值越小,從而達到最小權值。

#include 

#include

#include

#include

#include

#define _for(i,a,b) for(int i = a; i#define _rep(i,a,b) for(int i = a; i<=b; i++)

using

namespace

std;

const

int maxn = 1000000+10;

int n, t[maxn], cc;

void add(int x)

}int out()

void del()

}int main() else

if (a == 2) else

}return

0;}

洛谷P3378 模板 堆

洛谷p3378 輸入樣例 51 2152 32輸出樣例 25ac include using namespace std const int maxn 1e6 5 int heap maxn int ind 0 void insertheap 自下向上調整堆,因為除新加的結點外符合小根堆定義 ret...

洛谷 P3378 模板 堆

如題,初始小根堆為空,我們需要支援以下3種操作 操作1 1 x 表示將x插入到堆中 操作2 2 輸出該小根堆內的最小數 操作3 3 刪除該小根堆內的最小數 輸入格式 第一行包含乙個整數n,表示操作的個數 接下來n行,每行包含1個或2個正整數,表示三種操作,格式如下 操作1 1 x 操作2 2 操作3...

洛谷 P3378 模板 堆

然後稍微科普一下stl哦 在queue裡面有乙個叫做priority queue 優先佇列 初始化狀態為大根堆,經過這樣的操作可以變為小根堆 priority queue greater q 需要注意的是在greater 該括號與後面那個括號不能夠連在一起,否則會報錯,因為 或者可以不這樣做,直接用...