資料結構 維護佇列

2022-06-20 01:21:08 字數 1619 閱讀 4198

alice 給 bob 布置了很多任務作,他忙的不可開交,決定按照「先進先出(fifo)」的順序依次處理這些工作。但是處理過程中,bob 意識到這種順序可能不是最優的,因此他會選擇性的把某些工作延後。

抽象來說,你需要維護乙個佇列,支援三種操作:

操作一:1v,在隊尾加入乙個價值為 v 的任務。

操作二:2,如果當前隊列為空,輸出 -1;否則輸出隊頭任務的價值,並將隊頭彈出。

操作三:3,如果當前隊列為空,則不進行任何操作;否則將佇列中價值最小的任務挪到隊尾,保證沒有價值相等的任務。

輸入格式:

第一行乙個整數 n,表示操作個數。

接下來 n 行,每行乙個或兩個整數,格式如上。

輸出格式:

對於每個操作 2,輸出答案。

輸入樣例#1: 

5

1 11 222

2

輸出樣例#1: 

1

2-1

輸入樣例#2: 

6

1 11 232

22

輸出樣例#2: 

2

1-1

【題解】:

聽過講解之後,發現這個想法非常有趣。

其實push,pop一般佇列都可以維護,但是對於mov操作就需要大家開動一下腦筋了。

其實mov不一定需要移動。需要的是標記,最小值標記,然後用set來查詢最小值的位置,

然後push進去的歷史編號。

得到的val[no] 用陣列來儲存歷史編號的值即可。

push( ) 進入佇列不僅僅是佇列,還有set。

pop( ) 彈出時注意,有些用mov標記的可能出現在隊頭,記得要把它彈出。

mov( )操作涉及到兩個問題。

第乙個:用set的頭元素即為最小值的,同時set存的是pair型別,

第一關鍵字是:權值,val,第二關鍵字為:歷史編號 ,no

set直接找到對應的歷史編號進行標記。

同時在set刪除,然後對於佇列來說,重新push進去乙個val值。

附上**:

1 #include2

using

namespace

std;

3const

int n = 3e5+100

;4 queue q ;

5set

< pair >s;

6int

cur ,val[n] , top ;

7bool

deleted[n];

8void push( int

v )14

intpop()

19int ret =q.front();

20q.pop();

21s.erase( make_pair(val[ret],ret) );

22return

val[ret];23}

24void

mov()

30int

main()

31else

if( opt == 2

)else44}

45return0;

46 }

維護佇列

資料結構 佇列

一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...

資料結構 佇列

資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...

資料結構 佇列

code for fun created by dream whui 2015 1 25 include stdafx.h include include using namespace std define true 1 define false 0 define ok 1 define erro...