單調佇列 P1886 滑動視窗

2022-05-20 05:35:07 字數 1045 閱讀 1802

get 單調佇列

現在有一堆數字共n個數字(n<=10^6),以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。

例如:the array is [1 3 -1 -3 5 3 6 7], and k = 3.

輸入格式:

輸入一共有兩行,第一行為n,k。

第二行為n個數(輸出格式:

輸出共兩行,第一行為每次視窗滑動的最小值

第二行為每次視窗滑動的最大值

第一次做時候去學了乙個multiset,但是大概因為常數太大,t了三個點(multiset挺好用的,特別是有重複元素的時候。據資料 是用二叉平衡樹寫的,我覺得它挺像能刪除任意元素的堆)

第二次看了看題解,看到了單調佇列。花了一些時間仔細看懂,然後覺得單調佇列原來也不是很難嘛

單調佇列:

這個東西元素值(元素也有可能是乙個標號,那麼元素值就是標號為下標的值)是單調的。最初我看的時候覺得很奇怪,因為我覺得單調佇列裡面的元素值應該是完全合法的(即都是符合題意的)。不過這裡很巧妙。

比如說我們要維護乙個單調遞增的單調佇列,那麼隊頭應該是最小值、隊尾是最大值。我們現在插入乙個元素,它只有兩種情況:1.小於隊尾元素 2.大於等於隊尾元素。對於每乙個新的元素,由於它的時間戳最新,它們是都要被加進單調佇列中的。情況1時,顯然隊尾元素和新元素相比,既大又老,是肯定不優的(大:和新元素比不能作為最小值;老:比新元素先被排除,無效於之後操作);情況2時,因為新元素最新,即使它暫時沒有成為最小的,它也有可能在隊尾元素 老掉 之後成為最小的,於是保留在隊尾元素之後成為新的隊尾。

由此看來,隊首與隊尾之間的元素暫時沒有操作:它們肯定比隊首大比隊尾小,但是有可能時間戳更老,即無效。所以當它們成為隊首元素時,需要對它們進行時間戳 / 有效性的判斷。這樣在需要用時才進行去除操作,比每次更新時間便更新元素的效率更高。

那麼這題只需要維護兩個單調佇列即可。

P1886 滑動視窗 單調佇列

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...

單調佇列 洛谷P1886 滑動視窗

題目鏈結 dalao題解 題目給乙個長度為n的序列,然後給乙個值k,要求出長度為k的視窗在數列滑動過程中的最大值和最小值 圖示如下 比如給乙個長度為n 8的序列為 1 3 1 3 5 3 6 7 視窗長度是k 3 那麼視窗滑動中的 最小值就是 1 3 3 3 3 3 最大值就是 3 3 5 5 6 ...

洛谷 P1886 滑動視窗 單調佇列

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...