(線段樹)過滑動視窗

2021-09-17 18:17:08 字數 1113 閱讀 7584

**上一次我們談論單調佇列,這樣是可以過滑動視窗的 

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的視窗,這個視窗從第乙個下標開始一直向後移動,每次移動乙個單位,每次移動詢問一次該視窗中的最大值和最小值,最後輸出答案 題目分析 看似是乙個模擬,其實暴力模擬肯定會爆,因為涉及到區間最值問題,而且還是靜態的詢問,所以這個題目有三種方法可以解決,...