洛谷P1801 黑匣子 優先佇列

2022-08-21 16:36:09 字數 1014 閱讀 8901

題目鏈結

一道有點意思的題目

我們可以維護兩個優先佇列:pqmin和pqmax

其中 pqmin 是小根堆, pqmax 是大根堆

每次 add 乙個數字,則將數字推入到 pqmin 中

每次 get 時,從 pqmin 的堆頂拿出乙個數字並輸出,然後把這個數字推入到 pqmax 中

維護 pqmax 中的每乙個元素都小於等於 pqmin,即每次向pqmin推入元素後,比較 pqmax 和 pqmin 的堆頂元素。如果 pqmax 堆的堆頂元素大於 pqmin 堆頂的元素,則將 pqmin 堆頂的元素推入 pqmax,同時把 pqmax 堆頂的元素推入 pqmin 中

維護 pqmax 中的元素個數恆定為 i 個

則第 i + 1 個最小值一定是 pqmin 的堆頂

ac**(注意,我這裡是在推入 pqmin 前就判斷了是否不滿足上面的條件,提前推入到 pqmax 中)

#include

using namespace std;

const

int maxn =

200010

;int lists[maxn]

;priority_queue<

int, vector<

int>

, greater<

int>> pqmin;

priority_queue<

int> pqmax;

intmain()

int cur =0;

for(

int i =

0; i < n; i++

)else

cur++;}

cout << pqmin.

top(

)<< endl;

pqmax.

push

(pqmin.

top())

; pqmin.

pop();

}return0;

}

洛谷P1801 黑匣子

題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...

洛谷P1801 黑匣子

題目鏈結 看到題解中 維護兩個堆 突然想到了這道題的解法 維護兩個堆 大根堆h1,小根堆h2 大根堆裡的是最小的i個值,小根堆裡是剩下的值 每add乙個值時 插入到小根堆中,再比較小根堆的最小值與大根堆的最大值 若h2.top 將兩個元素取出,換一下再放進去 需要get時 將h2.top 取出,放進...

洛谷P1801 黑匣子

long long就果然還是就該用cout,沒有lld的ll留下了悔恨的眼淚 鏈結一放,要看什麼對頂堆的走開走開,我只會離散化加權值樹狀陣列 首先吧,這個詢問依次遞增就友善的一批,然後詢問某刻第k位,我們用權值樹狀陣列。首先如果i有,那麼在陣列中下標為i的位置就打成1,沒有就是0,樹狀陣列裡面存的是...