初談單調佇列 POJ 2823

2021-08-26 03:49:23 字數 1249 閱讀 3772

前幾天做過這題...當時使用線段樹做的....要跑9500ms才能過...今天看了下單調佇列...以為很難...但理解一下..發現單調佇列其實很簡單..

單調佇列是從數列前掃到數列後...維護乙個最值或者乙個所需的最優解之類的...每次的最優解都是在佇列的頭....所以要一直維護佇列..使其從頭到尾都是單調的..要能保證如果當前頭要出去了...後面的元素能馬上頂上來作為頭...

就拿poj2823來舉例....題目要求是給了一串n個數...從左到右每次框k個連續數..問每次框的數中最大數和最小數是什麼..樣例輸入輸出:

sample input

8 3

1 3

-1 -3 5 3 6 7
sample output

-1 -3 -3 -3 3 3
3 3 5 5 6 7
就拿樣例說....準備乙個佇列...myqueue...h代表佇列頭( 裡面存的是下標不是數..為了是判斷隊首出列)..p代表佇列尾..初始值h=1,p=0...就拿每次要一段最小值的佇列變化過程來描述一下:

1、插入第1個數 myqueue = h=1; p=1 小於所給的框..還不需輸出

2、插入第2個數 myqueue= h=1; p=2 ( 因為2號元素比1號元素大...先排到後面 ) 小於所給的框..還不需輸出

3、插入第3個數 myqueue= h=1; p=1; ( 因為3號元素為-1比1號元素的1和2號元素的3都要小~~所以一直擠到最前面...1,2都出列 ) 輸出 a[ myqueue[h] ]的值 -1

4 、插入第4個數 myqueue= h=1; p=1; ( 因為4號元素比3號元素小....所以擠掉3號元素 )輸出 a[ myqueue[h] ]的值 -3

5、插入第5個數 myqueue= h=1; p=2 ( 因為5號元素比4號元素大...先排到後面 ) 輸出 a[ myqueue[h] ]的值 -3

6、插入第6個數 myqueue= h=1; p=2 ( 因為6號元素比5號元素小....但是又沒有4號元素小..所以只能擠掉5號元素 )輸出 a[ myqueue[h] ]的值 -3

7、插入第7個數 myqueue= h=2; p=3 h=2; p=4; else p++; } if (k>=m) printf("%d ",a[myqueue[h]]); } printf("\n"); } void maxqueue() p++; } if (k>=m) printf("%d ",a[myqueue[h]]); } printf("\n"); } int main()

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個數字,視窗每次滑動乙個數字。求各個時刻視窗中的最大值和最小值。題目分析 單調佇列 棧中存放的一般為序列元素的索引 可能還有其他更多資訊 且每次新元素和隊尾 棧頂元素比較,若滿足單調性質,則入隊 入棧 否則,不斷彈出隊尾 ...