本文就不講優先佇列的基本用法了,主要講一下怎麼加標記。
具體的應用環境就是給你乙個佇列(或者棧),不斷的加入元素,同時也有可能刪除元素,同時還可能詢問這個佇列裡面的最大值。
你求最大值是不能去直接遍歷的,因為會超時,這樣就只能用優先佇列加標記了。
具體的做法是:
維護兩個優先佇列,乙個是最大值佇列,乙個是刪除佇列。
當然還有乙個普通的佇列,就是模擬題目本身的資料插入和刪除的。
①對於插入,首先是插入普通的佇列,然後插入優先佇列
②對於刪除,是刪除普通的佇列頭元素,然後把這個頭元素插入到刪除佇列中
③對於求最大值,就稍微麻煩一點點了,我們要結合刪除佇列和最值佇列。
由於兩個佇列都是優先佇列,所以兩者裡面的內容也都是有「順序關係」的,只要按從隊首的順序開始判斷,就能找到最大值。
具體的判斷是:如果刪除佇列的首元素和最值佇列的首元素相等,就表明最值佇列的首元素要刪除,所以同時刪除最值佇列和刪除佇列的這個元素,重複這個步驟,知道他們首元素不同,或者乙個隊列為空。
下面是我自己出的乙個題
有三種操作,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 ...