對頂堆的故事

2021-10-08 07:51:59 字數 865 閱讀 2814

總結:用大頂堆和小頂堆來實現,控制兩個堆的個數來實現將第幾個數暴露在兩個堆的中間,這樣就可以隨時輸出第幾個數,隨意以乙個頂堆的top()為標準,判斷下乙個數加在哪個堆裡,並時刻控制數量,這樣就可以將要求的第幾個數一直存疑兩個頂堆的top()之間。

#include

#include

using

namespace std;

priority_queue<

int,vector<

int>

,greater<

int>

>mn;

priority_queue<

int,vector<

int>

,less<

int>

>mx;

int ans[

100005];

intmain()

else

if(size_mx - size_mn >1)

//堆轉移

if(i &1)

if(mn.

size()

> mx.

size()

) ans[i /2+

1]= mn.

top();

else ans[i /2+

1]= mx.

top();

} m = m /2+

1;printf

("%d %d\n"

, n, m)

;for

(int i =

1; i <= m; i++

)printf

("\n");

}return0;

}

對頂堆學習筆記

處理動態中位數等問題,靈活運用了堆的性質,本質是維護兩個堆。大根堆 q 1 維護集合中較小值的部分的最大值。小根堆 q 2 維護集合中較大值的部分的最小值。注意到兩個堆中的元素各自是單調的,兩個堆間也是單調的。也就是說,q 1 中的任何乙個元素都不大於 q 2 中的任何乙個元素。那麼假設高度為權值,...

對頂堆學習筆記

演算法思想 一 問題 你需要維護乙個資料結構,支援以下操作 1.插入乙個數 2.查詢當前資料結構中的中位數 第k小數 k為定值 很多大佬應該一眼平衡樹了 平衡樹,不好寫!對頂堆,好寫!二 做法 以查詢中位數為準 我們考慮維護乙個小根堆和乙個大根堆,如圖 對頂 堆 令大根堆為s1,小根堆為s2 我們發...

思路的形成(對頂堆到對頂棧)

動態維護中位數用到了對頂堆,乙個大根堆乙個小根中位數在中間 在維護乙個整數序列時,需要在游標處改變值,都是在數列之間的某一位置進行操作,就想能不能像對頂堆那樣分為前後兩部分求呢,但是數列順序不能改變只是增刪和求字首和,因為只對游標前面的元素操作說白了就是對游標前面的數列操作,並且增刪只在最後一項嗎,...