單調佇列學習 PKU2823

2021-05-22 18:17:39 字數 935 閱讀 9089

一直以為單調佇列是優先佇列,2了 — —||||

本題利用單調佇列,單調佇列分為最大列和最小列,也就是分別單調遞減和遞增。下面以最大列為例說明:

我們要保證佇列中各個元素大小單調遞減(不是

不公升),各個元素的下標單調遞增。這樣才能保證隊首是最大值,而且更新時隊首永遠是最大值。因此,需要改造一下佇列。讓它變成能在兩頭刪除,在隊尾插入。

為了保證單調性,每次插入的時候,先判斷隊尾元素,若不大於待插入的元素(注意是最大隊),刪除(這樣才能保證插入的數小於原來尾部的數,保證遞減)。不斷刪除直到找到大於待插入的元素的隊尾或者隊空。刪除的時候,判斷隊首,若隊首元素下標小於規模為k的單調佇列的當前左邊界(右邊界i是遞增的,當右邊界為i時,左邊界就是i-k,若當前隊首的元素--也就是最優解--的下標超出了左邊界,說明在原陣列中這個最優解已經不在當前被圈的範圍內,果斷捨棄),這樣一直捨棄,直到隊首的元素下標進入當前被圈範圍

。隊首就是最優解。最小列理同與此。

單調佇列建議用結構體陣列實現,資料分別為佇列中元素的值和它在原陣列中的下標(位置):

POJ 2823單調佇列

g tle了,c 5329ms險過。用g 交了幾遍,總覺得沒錯,也沒改就反覆交了,傻裡傻氣的。再在網路上找了一 g ce後c 過了,就也試著用c 交自己的 了,過了。要不咱研究研究g 和c 好了 以上全是廢話!include using namespace std const int nn 1000...

單調佇列 poj2823

這段話 初談這個話題,相信許多人會有一種似有所悟,但又不敢確定的感覺。沒錯,這正是因為其中 單調 一詞的存在,所謂單調是什麼,學過函式的people都知道單調函式或者函式的單調性,直白一點說單調就是一直增或一直減。例如 1,3,5,9就是乙個單調增數列,數列中不存在後乙個數比前乙個數小的現象。那麼同...

poj 2823 單調佇列

題目大意 給定一行數,共n個。有乙個長度為k的視窗從左向右滑動,視窗中始終有k個數字,視窗每次滑動乙個數字。求各個時刻視窗中的最大值和最小值。題目分析 單調佇列 棧中存放的一般為序列元素的索引 可能還有其他更多資訊 且每次新元素和隊尾 棧頂元素比較,若滿足單調性質,則入隊 入棧 否則,不斷彈出隊尾 ...