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 進棧。否則 ...