單調佇列(求區間最值)

2021-08-05 20:13:31 字數 1017 閱讀 4476

p1440 求m區間內的最小值

題目描述

乙個含有n項的數列(n<=2000000),求出每一項前的m個數到它這個區間內的最小值。若前面的數不足m項則從第1個數開始,若前面沒有數則輸出0。

輸入輸出格式

輸入格式:

第一行兩個數n,m。

第二行,n個正整數,為所給定的數列。

輸出格式:

n行,第i行的乙個數ai,為所求序列中第i個數前m個數的最小值。

輸入樣例#1:

6 2

7 8 1 4 3 2

輸出樣例#1:

0 7

7 1

1 3

【資料規模】

m≤n≤2000000

這是一道單調佇列的題,我們借**來理清思路。

首先要用乙個雙端佇列來維護單調佇列,對於這個題而言,後插入而且比隊首元素小的元素肯定更優,因為它更新更好,而後插入而且比隊尾元素大的元素需要保留在隊尾,這些操作的前提是元素的可行性,即是在當前元素之前的m個之內。這樣,每乙個回合結束時輸出一次就可以了。

一般情況下我們用手打雙端佇列而不去用stl,但下面這個**是stl版的。

單調佇列 滑動區間最值

已知乙個陣列,a 1 a n 共n項,問1 k,2 k 1 3 k 2 n k 1 n這些區間的最大值分別是多少?第1行2個數,n和k,含義如題中所述。1 k n 100000 接下來1行,有n個數,表示a陣列。a i 1000000 1行,共 n k 1 個數,表示每個區間的最大值。輸入 8 35...

C 單調佇列求特定區間最大值

題目 單調佇列的應用 用乙個長度為k的視窗在長度為n的整數數列上從左往右滑動,每次滑動乙個單位,求出每次滑動後每個視窗裡面所包含的數的最大值。例如 當數列為 1,3,1,3,5,3,6,7 視窗大小k 3,可以得出,視窗位置 視窗內最大值 1 3 1 3 5367 31 3 1 3 5367 313...

RMQ求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。問題 給出n個數ai,讓你快速查詢某個區間的的最值。一 首先是預處理,用動態規劃 dp 解決。設a i 是要求區間最值的數列,f i,j 表示從...