Acwing 154 滑動視窗 單調佇列

2022-01-19 10:16:19 字數 1120 閱讀 6699

這題和poj2823是一樣的

解析:

暴力,直接對於每k個都遍歷一遍,很顯然複雜度o(nk)的話行不通。

對於這類問題,有乙個比較一致的思路,就是有些數字是無用的,或者用了幾次後就要被扔掉的,後續根本就排不上用場。

比如有ai,aj,ax,ax>ai>aj,找ax左邊第乙個比它小的數,很明顯,ai壓根不需要看,因為在ai之後有更小的aj

所以這就是單調佇列,佇列裡儲存的是單調遞增或遞減的數字。

單調佇列與單調棧的區別之一就是,單調佇列維護兩端,它的頭端可以出數,尾部可以進數。這個題的滑動視窗,佇列裡存下標,下標超範圍的話是需要出佇列的,而進佇列是從佇列尾插入。

先維護一遍最小,然後最大,**基本一致,單調性不同。

單調佇列的時間複雜度為o(n)

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=1e6+10,maxn2=31*maxn;

int a[maxn],q[maxn];//

¶óáðàï´æïâ±ê

intn,k;

intmain()

hh=0,tt=-1

; cout

<

for(int i=0;i)

}

AcWing 154 滑動視窗(模板)

給定乙個大小為n 10 6 n 106 n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 13 ...

Acwing 154 滑動視窗 單調佇列 經典模板

給定乙個大小為n 10 6 n 106 n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 13 ...

AcWing 154 滑動視窗(C 演算法)

有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。輸入格式 輸入包含兩行。第一行包含兩個整數n和k,分別代表...