**上一次我們談論單調佇列,這樣是可以過滑動視窗的
void slove_min()
}利用單調佇列的單調性,如果頭不是最小就將頭更新,最大反之即可**
**但對於區間查詢這類的問題線段樹一般都能過,這道題只需要線段樹裡面的建樹,查詢點即可,呢麼學了線段樹單調佇列就沒用了麼,也不是的對於動態規劃裡面的優化,單調佇列也是很有用的,所以學了就有他的用處**
線段樹ac**:
該題好像用線段樹g++過不去,需要用到c++
**#include#includeusing namespace std;
#define n 1500000
#define ll long long
int a[n];
//資料型別不統一也會造成runtime error
struct node
tree[4*n+10];
//更新
void update(int k)
//建樹
void build(int k,int l,int r)
int mid=(l+r)/2;
build(k*2,l,mid);//左
build(k*2+1,mid+1,r);//右
update(k);
}//查詢點
int query_max(int k,int l,int r)
int mid=(tree[k].l+tree[k].r)/2;
if(mid>=r)
return query_max(k*2,l,r);
if(mid=l&&tree[k].r<=r)
int mid=(tree[k].l+tree[k].r)/2;
if(mid>=r)
return query_min(k*2,l,r);
if(midn)
break;
printf("%d ",query_min(1,i,i+k-1));
}printf("\n");
for(int i=1;i<=n;i++)
printf("\n");
}**
滑動視窗(poj,線段樹維護區間最值)
現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...
poj 2823 滑動視窗 單調佇列 線段樹
題意 求滑動視窗中的最大值和最小值。分析 可以用線段樹來做,建完樹後,查詢區間n k 1次就行,每次查詢o 1 時間複雜度o n 也可以用單調佇列來做,比如求視窗中的最小值,那麼就維護乙個遞增的佇列,那麼最小元素就是隊首元素,每次右移,只要維護佇列元素是遞增的就可以。同樣,求最大值,是維護乙個遞減的...
洛谷 P1886 滑動視窗 單調佇列 線段樹
題目大意 給出乙個由n個數構成的序列,再給出乙個長度為k的視窗,這個視窗從第乙個下標開始一直向後移動,每次移動乙個單位,每次移動詢問一次該視窗中的最大值和最小值,最後輸出答案 題目分析 看似是乙個模擬,其實暴力模擬肯定會爆,因為涉及到區間最值問題,而且還是靜態的詢問,所以這個題目有三種方法可以解決,...