easy的學生的《資料結構》考試掛掉了,他求著easy再給他一次機會,easy出了這麼一道題,如果他的學生做出來就給這個學生一次重新考試的機會,題目是這樣的:
維護乙個名為佇列的資料結構,支援以下四種操作:
1. enqueue x
將值為x的元素放入佇列的尾部
2. dequeue
輸出當前佇列首部的元素之後刪除佇列首部的元素
3. max
輸出當前佇列中的最大值,若隊列為空則輸出」empty!」(沒有引號)
4. min
輸出當前佇列中的最小值,若隊列為空則輸出」empty!」(沒有引號)
包含多組測試資料
每組測試資料以乙個整數n作為開始(0<=n<=500000)
當1<=n<=500000時,意味著會有n次佇列操作,當n為0時意味著輸入資料結束
如果1<=n<=500000之後會有n行,每行會有一條佇列操作命令,分別是
1.enqueue x
將值為x的元素放入佇列的尾部
2.dequeue
輸出當前佇列首部的元素之後刪除佇列首部的元素
3.max
輸出當前佇列中的最大值,若隊列為空則輸出」empty!」(沒有引號)
4.min
輸出當前佇列中的最小值,若隊列為空則輸出」empty!」(沒有引號)
請按命令進行相關佇列操作或者輸出
對於每一組測試資料,第一行輸出」case x:」表示第x組資料(沒有引號)之後
對每乙個要求輸出的操作進行輸出,乙個操作的輸出佔一行
3enqueue 1
maxdequeue
5enqueue 2
maxdequeue
mindequeue
0
case 1:11emm 小白第一次寫部落格 突然緊張 。。。。。。。。。case 2:22
empty!
empty!
思路:構造三個佇列,乙個普通佇列,乙個維護最大值,乙個維護最小值,每輸入乙個數,就更新維護一次,最大值佇列和最小值佇列,如果大於最大值佇列末尾的乙個數那麼就把最後的乙個數pop()出去,否則就加入到最大值佇列裡,最小值佇列同理維護,當要輸出 並且刪除時直接判斷普通佇列的該數,與最大值佇列或最小值佇列的首位是否相等,若是相等的,則把最大值數列或最小值數列中的首位刪去(注意空佇列的情況)
**:#include
using namespace std;
int n;
int main()
b.push_back(t);
while(c.size()&&c.back() > t)
c.push_back(t);
}if(s1[0] == 'd')
}if(s1[1] == 'a')
if(s1[1] == 'i')}}
}
動態規劃 單調佇列維護 烽火傳遞
用q i 表示到i前面符合條件的最小代價為多少 要取到i 單調佇列維護區間中q i 的最小值 l,r表示單調佇列的隊首與隊尾 從1到n迴圈,若q qj r q i 隊尾比當前大 彈出隊尾將當前放入 若qj l 最後更新一下q i q l a i 符合要求區間中最小值加當前值為當前最小值 答案在n n...
運氣糖果(字首和單調遞增佇列維護)
運氣糖果 description 今天zjzjzj 學長想轉運,所以某某為他帶來nn n顆運氣糖果。每顆運氣糖果都有不同的幸運值。既然zjzjzj 學長想轉運,自然希望自己的運氣越來越好了,但zjzjzj 學長最多又只能吃mm m顆 m nm leq nm n 糖果。而且吃東西自然就不想思考了,於是...
查稅 斜率優化 單調佇列維護凸包 分塊 )
id3167 有n個辦公室,m個操作,依次讀入 type 如果type為1 接著讀入 t k z s 表示乙個公司於t時刻進駐k辦公室,每天盈利為z,其一開始有s元。若k位置本有別的公司,別的公司會被覆蓋。如果type為2 接著讀入t b 表示於t時刻,你要找出區間 a,b 內,最有錢的公司的錢數。...