alice 給 bob 布置了很多任務作,他忙的不可開交,決定按照「先進先出(fifo)」的順序依次處理這些工作。但是處理過程中,bob 意識到這種順序可能不是最優的,因此他會選擇性的把某些工作延後。
抽象來說,你需要維護乙個佇列,支援三種操作:
操作一:1v,在隊尾加入乙個價值為 v 的任務。
操作二:2,如果當前隊列為空,輸出 -1;否則輸出隊頭任務的價值,並將隊頭彈出。
操作三:3,如果當前隊列為空,則不進行任何操作;否則將佇列中價值最小的任務挪到隊尾,保證沒有價值相等的任務。
輸入格式:
第一行乙個整數 n,表示操作個數。
接下來 n 行,每行乙個或兩個整數,格式如上。
輸出格式:
對於每個操作 2,輸出答案。
輸入樣例#1:
5輸出樣例#1:1 11 222
2
1輸入樣例#2:2-1
6輸出樣例#2:1 11 232
22
21-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...