單調佇列 優先佇列

2021-10-19 17:34:04 字數 4649 閱讀 9155

dequeue<

int>que;

//建立雙向佇列

que.

push_front()

//在佇列前面塞乙個元素

que.

push_back()

//在佇列後面塞乙個元素

que.

pop_front()

//刪除佇列第乙個元素

que.

pop_back()

//刪除佇列的最後乙個元素

que.

clear()

//清空佇列

que.

empty()

//判斷是否為空

que.

size()

//返回佇列元素個數

對每個長度為k的滑動窗體,求其最大值和最小值

使出秘技dequeue (stl賽高!)

這裡根據雨巨生動形象的例子,我來簡單描述一下下:

題意:給出各屆acmer的實力,眾所周知大學基本上是四年,所以我們滑動視窗的大小就是4,問每個視窗中實力最強與最弱的是多少

舉個樣例:1 4 6 3 3 3 2

我們現在先求最大值,最小值在最大值的基礎上改一改就行。

首先我們看給1入佇列(是dequeue,後面不贅述),因為沒到達四個元素,所以不輸出,再到第二個元素4,大於1,說明在4的偉大作用下,1已經廢了,就直接扔出去,也就是「去尾」,得到佇列 4 。再到6,6 > 4,所以在6的存在下,4 廢了,扔出去,得到佇列 6。再到3,3 小於6,說明他有機會,因為可以等到6的退役了(也就是6滑出視窗了),他就可能是最大的,把 3塞進去,得到6,3的佇列,現在達到視窗的大小,所以輸出隊頭6,再看3,等於佇列尾的元素,就把他也塞進去,再輸出乙個6,下乙個3塞進來以後,我們判斷發現佇列頭還沒有出視窗,就再輸出6,到了2,塞進去,發現6已經出了視窗,就得「去頭」,所以輸出3

總結一下,實現單調佇列,主要分四個部分:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define inf 0x3f3f3f3f

#define max 1000000 + 5

typedef

long

long ll ;

inline

intintread()

while

(ch >=

'0'&& ch <=

'9')

return s * w;

}int tr[max]

;int

main()

q.push_back

(i);

//入隊

if(i >= k)

if(i == k) cout

];//控制空格的輸出

else cout<<

' '

];}}

cout

clear()

;//清空佇列

for(

int i =

1; i <= n; i++

) q.

push_back

(i);

if(i >= k)

if(i == k)

cout

];else

cout<<

' '

];}}

cout<}

手寫佇列

head代表佇列頭,tail代表佇列尾

結構體的q陣列即為「雙向佇列」,其id用來記錄下標,val來記錄值

還是那四步,去尾入隊去頭取解。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define inf 0x3f3f3f3f

#define max 1000000 + 5

typedef

long

long ll ;

inline

intintread()

while

(ch >=

'0'&& ch <=

'9')

return s * w;

}int tr[max]

, n, k;

struct ranq[max]

;void

getmin()

} cout<}void

getmax()

} cout<<

'\n';}

intmain()

我看了一下這兩個的時間差的不多,2ms,我感覺還是dequeue好寫一些,嘎嘎,感覺寫成函式更美觀一點哎=(.)=

n個果子,數目為tr[i],進行n - 1次合併操作,每次都消耗兩堆果子的重量和的體力,耗費的總體力等於每次合併所耗費的體力和,求最小值

使用秘技stl,priority_queue來操作,但這個優先佇列是從大到小的,有乙個非常非常非常簡便的方法來改變其順序——加負號!!!

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define inf 0x3f3f3f3f

#define max 1000000 + 5

typedef

long

long ll ;

priority_queue<

int>q;

intmain()

ll ans =0;

for(

int i =

1; i < n;

++i)

cout

}

手撕優先佇列。

首先我們要知道優先佇列其實是一種堆,是一棵完全二叉樹,而這個二叉樹又滿足乙個規律——任意節點都小於(或大於)其子節點

這個題我們要用到插入,彈出,取頂三個操作

插入

對於乙個新的數插進來,我們不能壞了優先佇列的順序,所以就插在最後,然後和他的父節點進行比較,看看需不需要交換,一直換下去

彈出

對於彈出的數是隊首,也就是這裡面最小的(或者最大的數),所以可以直接把最後乙個元素拿過來替代他,然後再和他的子節點比較,這裡會出問題,因為上次是和父節點比較(眾所周知,你只有乙個爹,但你爹不一定只有你乙個孩子,是不是很形象o(≧v≦)o),只有乙個父節點,而現在和子節點比較,對於公升序的優先佇列,我們得取小的子節點與父節點交換

就直接取q[1]即可

注意一些邊界條件

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define inf 0x3f3f3f3f

#define max 1000000 + 5

typedef

long

long ll ;

inline

intintread()

while

(ch >=

'0'&& ch <=

'9')

return s * w;

}int n,q[max]

,tot, ans;

void

push

(int x)

}int

top(

)void

pop(

)while

(j <= tot && q[j]

< q[i])}

intmain()

for(

int i =

1; i < n;

++i)

cout

}

寫的不是很好,也不全,但我會回來補充滴 o(︶︿︶)o

單調佇列 優先佇列

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

RMQ 優先佇列與單調佇列 專題訓練

指使用stl庫的priority queue進行模擬,優點在於實現簡單。可用於求區間最值,由於使用堆操作,時間複雜度在 n log 2 n 2 log 2 當資料較大時容易tle 單調佇列使用stl的deque進行模擬,也可以用陣列和雙指標 head,tail 有兩種操作,刪頭和去尾,實現乙個區間內...

棧和佇列 單調佇列 單調棧

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