黑匣子(優先佇列,大小根堆)

2021-08-09 21:13:26 字數 1904 閱讀 3921

(noi導刊2010提高(06))

(來自luogu)

題目描述

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的.而i等於0。這個black box要處理一串命令。

命令只有兩種:

add(x):把x元素放進blackbox;

get:i加1,然後輸出blackhox中第i小的數。

記住:第i小的數,就是black box裡的數的按從小到大的順序排序後的第i個元素。例如:

我們來演示一下乙個有11個命令的命令串。(如下圖所示)

現在要求找出對於給定的命令串的最好的處理方法。add和get命令分別最多200000個。現在用兩個整數陣列來表示命令串:

1.a(1),a(2),…a(m):一串將要被放進black box的元素。每個數都是絕對值不超過2000000000的整數,m$200000。例如上面的例子就是a=(3,1,一4,2,8,-1000,2)。

2.u(1),u(2),…u(n):表示第u(j)個元素被放進了black box裡後就出現乙個get命令。例如上面的例子中u=(l,2,6,6)。輸入資料不用判錯。

輸入輸出格式

輸入格式:

第一行,兩個整數,m,n。

第二行,m個整數,表示a(l)

……a(m)。

第三行,n個整數,表示u(l)

…u(n)。

輸出格式:

輸出black box根據命令串所得出的輸出串,乙個數字一行。

輸入輸出樣例

輸入樣例#1:

7 4

3 1 -4 2 8 -1000 2

1 2 6 6

輸出樣例#1:

3 3

1 2

說明對於30%的資料,m≤10000;

對於50%的資料,m≤100000:

對於100%的資料,m≤200000。

這個題是利用stl庫裡面的優先佇列來做的,我們可以考慮線性結構上有兩個堆,左邊是大根堆,右邊是小根堆,這樣我們確定乙個數是通過讓大根堆和小根堆的堆頂所在的位置同時向左或向右移動。

而向右移動的時候我們讓大根堆堆頂壓入小根堆,然後pop掉大根堆中的這個元素,向左移動的話就是讓小根堆堆頂壓入大根堆,然後pop掉小根堆中的這個元素。

然後讀出乙個固定的根堆的堆頂元素即可。

這個題目類似於乙個重慶一次省隊選拔賽的一道叫做中位數的題目,可以試著用這個方法ac那個題目。

還有就是要熟練背誦這段stl的**。

Luogu1801 黑匣子 堆

傳送門 題意 給出兩種命令 add x 把 x 元素放進 black box get i 加 1,然後輸出 black box 中第 i 小的數。輸出每次get操作的結果。題解 注意到每次求的第k小中,k從1開始遞增。則維護乙個大根堆和乙個小根堆,大根堆裡記錄前k小的數字,小根堆裡記錄其他的數字。這...

洛谷P1801 黑匣子 優先佇列

題目鏈結 一道有點意思的題目 我們可以維護兩個優先佇列 pqmin和pqmax 其中 pqmin 是小根堆,pqmax 是大根堆 每次 add 乙個數字,則將數字推入到 pqmin 中 每次 get 時,從 pqmin 的堆頂拿出乙個數字並輸出,然後把這個數字推入到 pqmax 中 維護 pqmax...

雜題 黑匣子(堆的簡單應用)

黑匣子 時間限制 1s 記憶體限制 128mb 問題描述 black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1...