題意:
求滑動視窗中的最大值和最小值。
分析:
可以用線段樹來做,建完樹後,查詢區間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就是乙個單調增數列,數列中不存在後乙個數比前乙個數小的現象。那麼同...