堆 題解 P3378 模板 堆

2022-03-19 08:11:42 字數 1023 閱讀 5409

堆就是一顆二叉樹,滿足父親節點總是比兒子節點大(小)。因此,堆也分為大根堆和小根堆,大根堆就是父親節點比兒子節點大,小根堆正好相反。注意加粗的地方,是每乙個節點哦!!!!!

還是直接看例題吧,這樣講起來更加生動。

上題:【模板】堆

解析:這道題明顯就是乙個小根堆,那,怎麼實現呢?熱愛陣列的我選擇了陣列實現明明就是指標不會。

操作1:新增乙個數字

這裡需要用到兩個函式,乙個insert函式,用來插入,乙個ufix函式,用來更新。

void ufix(int i)

}void insert(int x)

操作2:輸出最小的數字(也就是堆頂)

直接輸出堆頂就行了qwq。

if(x == 2) cout << h[1] << endl;
操作3:刪除最小的數字(也就是堆頂)

這裡也需要兩個函式,乙個delet函式,用來刪除,乙個dfix函式,用來更新。

void dfix(int i)

}void delet()

完整**

#include using namespace std;

int n , tot = 0;

int h[1000010];

void ufix(int i)

}void dfix(int i)

}void insert(int x)

void delet()

int main()else if(x == 2) cout << h[1] << endl;

else delet();

} return 0;

}

其實優先佇列可以直接a的(其內部就是堆實現嘛),但是自己手寫一遍可以加深理解哦。

洛谷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 該括號與後面那個括號不能夠連在一起,否則會報錯,因為 或者可以不這樣做,直接用...