1239 Easy的佇列 (單調佇列)

2021-08-21 23:43:25 字數 2681 閱讀 6289

題目描述

easy的學生的《資料結構》考試掛掉了,他求著easy再給他一次機會,easy出了這麼一道題,如果他的學生做出來就給這個學生一次重新考試的機會,題目是這樣的:

維護乙個名為佇列的資料結構,支援以下四種操作:

enqueue x

將值為x的元素放入佇列的尾部

dequeue

輸出當前佇列首部的元素之後刪除佇列首部的元素

max

輸出當前佇列中的最大值,若隊列為空則輸出」empty!」(沒有引號)

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!

題解:通過維護三個佇列, 乙個維護最大值, 乙個維護最小值, 乙個維護一般佇列, 怎麼維護最大值的和最小值的佇列呢?

我們每插入乙個元素時, 就要與隊尾的元素比較, 如果插入的元素比隊尾的元素大, 那麼就刪除現在隊尾的元素,下乙個隊尾的元素比較,如果還比隊尾大,再刪了,再與新的隊尾元素比較,如此迴圈往復,直到隊列為空,或者隊尾的元素要大於或等於插入的元素, 那麼就將新元素插入佇列尾部。如此一來這個佇列就是乙個從隊首至隊尾 永遠單調遞減的序列,隊首即為max值。最小值佇列就是反著來 維護乙個 隊首至隊尾 永遠單調遞增的序列,隊首即為min值。佇列中的資料除了要儲存它的值還要為其分配乙個編號。為啥呢,因為還有出隊操作啊,怎麼判斷,要出隊的元素是否就是max佇列和min佇列隊首的元素的,看其編號即可。

同時也熟練了一下雙向佇列的使用。

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define maxm 16000000 + 10

#define maxn 500000 + 10

using namespace std;

typedef

long

long ll;

const ll mod =

1e9+7;

pair<

int,

int> p[maxn]

;int

main()

else

else

q_up.

pop_back()

;}if(q_up.

empty()

)}if(q_down.

empty()

) q_down.

push_back

(p[cnt]);

else

else

q_down.

pop_back()

;}if(q_down.

empty()

)}}if

(op[0]

=='d')if

(q.front()

.second == q_up.

front()

.second)

if(q.

front()

.second == q_down.

front()

.second)

printf

("%d\n"

, q.

front()

);q.

pop_front()

;}if(op[0]

=='m'

)else

printf

("empty!\n");

}if(op[1]

=='i'

)else

printf

("empty!\n");

}}cnt ++;}

}}/*the wam is f**king interesting .

*/

單調佇列 優先佇列

dequeue int que 建立雙向佇列 que.push front 在佇列前面塞乙個元素 que.push back 在佇列後面塞乙個元素 que.pop front 刪除佇列第乙個元素 que.pop back 刪除佇列的最後乙個元素 que.clear 清空佇列 que.empty 判斷...

單調佇列 優先佇列

如果乙個人比你年輕還比你強,那你就要被踢出去了 單調佇列 來來來,神犇巨佬 金牌 au 爺 aker 站在最上面,蒟蒻都靠下站!優先佇列 顧名思義,所謂單調佇列,那麼其中的元素從隊頭到隊尾一定要具有單調性 單調公升 單調降等 它被廣泛地用於 滑動視窗 這一類 rmq 問題,其功能是 o n 維護整個...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...