總結:用大頂堆和小頂堆來實現,控制兩個堆的個數來實現將第幾個數暴露在兩個堆的中間,這樣就可以隨時輸出第幾個數,隨意以乙個頂堆的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 我們發...
思路的形成(對頂堆到對頂棧)
動態維護中位數用到了對頂堆,乙個大根堆乙個小根中位數在中間 在維護乙個整數序列時,需要在游標處改變值,都是在數列之間的某一位置進行操作,就想能不能像對頂堆那樣分為前後兩部分求呢,但是數列順序不能改變只是增刪和求字首和,因為只對游標前面的元素操作說白了就是對游標前面的數列操作,並且增刪只在最後一項嗎,...