t019 window 單調佇列

2021-09-28 10:01:00 字數 1488 閱讀 1319

time limit: 2 second

memory limit: 256 mb

【問題描述】

給你乙個長度為n 的陣列,乙個長為k的滑動的窗體從最左移至最右端,你只能見到視窗的k個數,每次窗體向右移動一位,如下表:
window position min value max value

[1 3 -1] -3 5 3 6 7 -1 3

1 [3 -1 -3] 5 3 6 7 -3 3

1 3 [-1 -3 5] 3 6 7 -3 5

1 3 -1 [-3 5 3] 6 7 -3 5

1 3 -1 -3 [5 3 6] 7 3 6

1 3 -1 -3 5 [3 6 7] 3 7

你的任務是找出視窗在各位置時的max value和min value。
【輸入格式】

第一行n,k,第二行為長度為n的陣列
【輸出格式】

第一行每個位置的min value,第二行每個位置的max value
【輸入樣例1】

8 3

1 3 -1 -3 5 3 6 7

【輸出樣例1】

-1 -3 -3 -3 3 3

3 3 5 5 6 7

資料規模

20%:n≤500;50%:n≤100000;100%:n≤1000000;
【題目鏈結】:

【題解】

最小值維護乙個單調遞增佇列就能搞定;(a[i]<=a[i+1]

每次加入佇列中的元素先和隊尾比較一下,對於隊尾比它大的數,直接刪掉就好,因為要求的是最小值,而你加入的這個數是在框框裡面的,那麼如果你比這個數還大,那麼你肯定沒有存在的價值了;

然後對於隊頭元素,如果它不在框框裡面也全都刪掉,直到隊頭元素在框框裡為止,然後輸出隊頭元素;

最大值類似.

(可以在2s內出)

【完整**】

#include 

#include

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

const

int maxn = 1e6+100;

int n,k,a[maxn];

int m[maxn],mm[maxn],h,t;

int main()

for (int i = k;i<= n;i++)

h = 1,t = 0;

for (int i = 1;i <= k-1;i++)

for (int i = k;i <= n;i++)

return

0;}

滑動視窗 洛谷T1866(單調佇列)

咕咕咕 單調佇列板子題 一 基本 1.單調佇列 特殊的雙端佇列,內部元素。分為最大佇列 單調遞增 和最小佇列 單調遞減 兩種 二 應用 本題中 大部分單調佇列優化的動態規劃問題都和定長連續子區間的最值問題 includeusing namespace std inline intread while...

蚯蚓 NOIP2016D2T2 單調佇列

本題中,我們將用符號 c 表示對c向下取整,例如 3.0 3.1 3.9 3。蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有n只蚯蚓 n為正整數 每只蚯蚓擁有長度,我們設第i只蚯蚓的長度為a i i 1,2,n 並保證所有的長度都是非...

11 3清北集訓T1work dp 單調佇列優化

subtask1 暴力dp o nk include include include include include include include includeusing namespace std typedef long long ll const ll inf 0x3f3f3f3f inl...