帶刪除的優先佇列(延緩刪除,加標記)

2021-08-20 21:01:35 字數 1382 閱讀 6941

本文就不講優先佇列的基本用法了,主要講一下怎麼加標記。

具體的應用環境就是給你乙個佇列(或者棧),不斷的加入元素,同時也有可能刪除元素,同時還可能詢問這個佇列裡面的最大值。

你求最大值是不能去直接遍歷的,因為會超時,這樣就只能用優先佇列加標記了。

具體的做法是:

維護兩個優先佇列,乙個是最大值佇列,乙個是刪除佇列。

當然還有乙個普通的佇列,就是模擬題目本身的資料插入和刪除的。

①對於插入,首先是插入普通的佇列,然後插入優先佇列

②對於刪除,是刪除普通的佇列頭元素,然後把這個頭元素插入到刪除佇列中

③對於求最大值,就稍微麻煩一點點了,我們要結合刪除佇列和最值佇列。

由於兩個佇列都是優先佇列,所以兩者裡面的內容也都是有「順序關係」的,只要按從隊首的順序開始判斷,就能找到最大值。

具體的判斷是:如果刪除佇列的首元素和最值佇列的首元素相等,就表明最值佇列的首元素要刪除,所以同時刪除最值佇列和刪除佇列的這個元素,重複這個步驟,知道他們首元素不同,或者乙個隊列為空。

下面是我自己出的乙個題

有三種操作,1是插入乙個元素,2是刪除元素,3是求最大值。這裡的容器是stack,其實queue也行,把名字和函式改一下就行了。

#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

priority_queuepq,eraseq;

stackq;

int main()

else if( type == 2 )

}else if( type == 3 )

}return 0;}/*

1 21 7

1 31 4

1 93

*/

其實之所以寫這篇部落格,是因為在邀請賽時遇到了類似的題,然而沒有寫出來,還是感覺資料結構掌握的不是很好啊。

題目**--------2018 寧夏acm邀請賽

(由於出題組比較注重智財權,題目可能不會出現在網上)

----休息一會,馬上補上

另外,對於帶標記的模板,也可以參照下面這個,是別人寫的

struct heap

void erase(int x)

int top()

}h;

Vector的應用 帶刪除標記的vector

在正規表示式識別的過程中,需要同時跟蹤多個正規表示式的識別狀態。最自然的做法是用n個元素的指標陣列同時跟蹤n個識別路徑。當輸入的字元跟識別路徑上接受的輸入不符時,這一路的指標失效。當識別路徑上遇到 字元時,這一路的指標發生分叉。stl的vector 能有效的進行自動管理記憶體,比較適合用來儲存這種個...

3 7帶標誌的迴圈佇列的插入刪除操作

題目 假設以陣列q m 存放迴圈佇列中的元素,同時設定乙個標誌tag,以tag 0和tag 1來區別在隊頭指標 front 和隊尾指標 rear 相等時,佇列狀態為 空 還是 滿 試編寫與此結構相應的插入 enqueue 和刪除 dequeue 演算法。思路 當tag等於0並且頭指標和尾指標指向同一...

linux下刪除帶 的檔案

不知為何主目錄下突然多了個 sv檔案,目測是因為nmap的 sv引數產生的。寫下來權當做個筆記 現在來模擬下當時的情況 touch sv touch sv 兩種都行現在工作目錄底下會產生乙個檔名為 sv的檔案 如果執行 rm sv會產生乙個錯誤 rm invalid option s try rm ...