資料結構 從堆到「漏斗」

2021-07-23 08:59:43 字數 1402 閱讀 2342

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

命令只有兩種:

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

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

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

現在要求找出對於給定的命令串的最好的處理方法。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)個元素被放進了blaek box裡後就出現乙個get命令。例如上面的例子中u=(l,2,6,6)。輸入資料不用判錯。

輸入輸出格式

輸入格式:

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

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

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

輸出格式:

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

這道題**於2023年的noi導刊。看到這題的感受如何?不就是排序嗎?有道理,我們來排排看!

假設我們用o(n log n)的演算法……最多應付……3000資料……

那麼,這種慢慢插入的方法,是不是能令人想到堆呢?沒錯,其實就是乙個不斷進行堆操作的過程。

不過,想到這一步,還是眼淚掉下來……

堆的性質不能保證數列有序啊!

但是仔細想想,這題參與操作的無非就是恰在某條分割線上位置的資料……每一次get就是移動這條分割線,add就是往分割線處插資料……

突然有乙個漏斗的形狀浮現在腦海中!

沒錯……就是乙個漏斗!兩個堆,像漏斗一樣地擺放。上面是大頂堆,下面是小頂堆!大功告成。

【事實上這題可以用pq模版】

#include 

#include

#include

#include

#include

using

namespace

std;

#define read(x) scanf("%d",&x)

#define write(x) printf("%d\n",x)

int a[200005],u[200005],na,nu;

vector

vb,vs;

int add(int x)

void get()

int main()

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...