單調佇列 維護

2021-08-21 22:41:33 字數 1428 閱讀 7380

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組資料(沒有引號)之後

對每乙個要求輸出的操作進行輸出,乙個操作的輸出佔一行

3

enqueue 1

maxdequeue

5enqueue 2

maxdequeue

mindequeue

0

case 1:11

case 2:22

empty!

empty!

emm 小白第一次寫部落格 突然緊張 。。。。。。。。。

思路:構造三個佇列,乙個普通佇列,乙個維護最大值,乙個維護最小值,每輸入乙個數,就更新維護一次,最大值佇列和最小值佇列,如果大於最大值佇列末尾的乙個數那麼就把最後的乙個數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 內,最有錢的公司的錢數。...