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

2022-08-12 14:00:15 字數 917 閱讀 3026

題意:

求滑動視窗中的最大值和最小值。

分析:

可以用線段樹來做,建完樹後,查詢區間n-k+1次就行,每次查詢o(1),時間複雜度o(n)

也可以用單調佇列來做,比如求視窗中的最小值,那麼就維護乙個遞增的佇列,那麼最小元素就是隊首元素,每次右移,只要維護佇列元素是遞增的就可以。同樣,求最大值,是維護乙個遞減的佇列。

#include

#include

#include

using namespace std;

const int n=1e6+9;

#define pos first

#define val second

#define mp make_pair

typedef pairpii;

pii q[n];

int a[n];

int n,k;

void getmin()

printf("%d",q[l].val);

for(;iif(q[l].pos

1)l++;

while(r>=l&&q[r].val>a[i])r--;

q[++r]=mp(i,a[i]);

printf(" %d",q[l].val);

}printf("\n");

}void getmax()

printf("%d",q[l].val);

for(;iif(q[l].pos

1)l++;

while(r>=l&&q[r].valq[++r]=mp(i,a[i]);

printf(" %d",q[l].val);

}printf("\n");

}int main()

return

0;}

poj 2823 滑動視窗 單調佇列

poj2823 思路 最暴力的做法就是模擬過程,列舉每乙個長度為k的區間,然後遍歷一遍找最值,複雜度為n 2 這題n的範圍到了1e6 n 2 在規定時間內是跑不完的 所以這題要用資料結構優化 什麼樣的資料結構呢 對於當前區間為l到r 那麼往後移動了之後 區間變為了 l 1 到 r 1 也就是a l ...

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