poj 2823 滑動視窗 單調佇列

2021-10-04 13:36:09 字數 868 閱讀 5904

poj2823

思路

最暴力的做法就是模擬過程,列舉每乙個長度為k的區間,然後遍歷一遍找最值,複雜度為n^2

這題n的範圍到了1e6 n^2 在規定時間內是跑不完的 所以這題要用資料結構優化

什麼樣的資料結構呢 對於當前區間為l到r

那麼往後移動了之後 區間變為了 l+1 到 r+1

也就是a[l]被彈出 a[r+1]加入

所以我們考慮乙個雙端佇列(雙端佇列與佇列的區別在於 佇列是一邊只能進 另一邊只能出 雙端佇列兩邊都可以進出)

首先對於已經在佇列內的 我們要去把不屬於當前區間的彈出 這樣就滿足佇列內的都是在此區間的

然後我們佇列要維護什麼呢

比如要求最小值維護乙個單調遞減的佇列 保證隊首就是所要求的

那麼我們這樣考慮如果當前要加入的這個值與佇列尾部的數去比較,佇列尾部的數就可以移除掉了 因為對於即將被移除掉的這個數他是已經輸出過了的 因為我們維護的是佇列首第乙個為所要求的結果這一段可能會不太好理解 其實可以拿著樣例 手動模擬一下過程就懂了

對於求最大值同理去處理

#include

#include

#include

using namespace std;

deque<

int> q,p;

void

out(

int a)

intmain()

putchar

('\n');

for(

int i=

1;i<=n;i++

)return0;

}

poj 2823 滑動視窗 單調佇列 線段樹

題意 求滑動視窗中的最大值和最小值。分析 可以用線段樹來做,建完樹後,查詢區間n k 1次就行,每次查詢o 1 時間複雜度o n 也可以用單調佇列來做,比如求視窗中的最小值,那麼就維護乙個遞增的佇列,那麼最小元素就是隊首元素,每次右移,只要維護佇列元素是遞增的就可以。同樣,求最大值,是維護乙個遞減的...

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就是乙個單調增數列,數列中不存在後乙個數比前乙個數小的現象。那麼同...