POJ 滑動視窗 優先佇列的應用

2021-08-21 08:58:49 字數 1123 閱讀 6931

資料結構與演算法a (第三章 棧與佇列 練習題): 滑動視窗

對於最大最小值分別維護乙個優先佇列(儲存元素下標)。以最小值為例。

每次遇到乙個新元素,從隊尾插入。插入時刪去佇列中比該值大的元素。(因為當前值出現的下標較晚,所以以後一定範圍視窗的最小值不會超過該值)。隊首是當前視窗的最小值。同時要注意維護隊首的下標是否在當前視窗內。

#include 

#include

#include

#include

#include

#include

#include

using namespace std;

int n, k, mmin, mmax;

int arr[1010000];

// priority_queue max_q;

// priority_queue, greater >min_q; // 存放當前視窗最大最小值

int min_q[1010000], max_q[1010000], min_left=0, min_right=0, max_left=0, max_right=0;

vector min_v;

vector max_v; // 存放最小值和最大值序列

int main()

min_q[min_right++] = i;

// 更新左邊下標在範圍之外的元素

while(min_q[min_left]

< i-k+1)

min_left++;

// 處理最大值佇列

while(max_right>max_left && arr[max_q[max_right-1]]q[max_right++] = i;

// 更新左邊下標在範圍之外的元素

while(max_q[max_left]

< i-k+1)

max_left++;

if(i >= k-1)

}// 初始化視窗

for(int i=0;i1;i++)

printf("\n");

for(int i=0;i1;i++)

return

0;}

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 滑動視窗 單調佇列

poj2823 思路 最暴力的做法就是模擬過程,列舉每乙個長度為k的區間,然後遍歷一遍找最值,複雜度為n 2 這題n的範圍到了1e6 n 2 在規定時間內是跑不完的 所以這題要用資料結構優化 什麼樣的資料結構呢 對於當前區間為l到r 那麼往後移動了之後 區間變為了 l 1 到 r 1 也就是a l ...

佇列 單調佇列 滑動視窗

總時間限制 12000ms 記憶體限制 65536kb 描述給定乙個長度為n n 10 6 的陣列。有乙個大小為k的滑動視窗從陣列的最左端移動到最右端。你可以看到視窗中的k個數字。視窗每次向右滑動乙個數字的距離。下面是乙個例子 陣列是 1 3 1 3 5 3 6 7 k 3。視窗位置 最小值最大值 ...