coding使我忘記化學
傳送門
如題,實質上是在考察單調佇列,最大值和最小值可分別用乙個單調佇列排序輸出。
操作方便,定義兩個陣列分別儲存佇列和每個元素的序號
由題得佇列原則:佇列陣列中末尾元素的序號與開頭元素序號之差不能大於k,使佇列的範圍保持為視窗的寬度
在保證這點之後,只要同時保證佇列始終是單調排序,這樣當元素序號》=視窗寬度(保證視窗圈滿元素)時,只要迴圈輸出開頭元素就可以了。
那麼如何保證佇列單調?拿最大值舉例:在向佇列中新增元素的過程中,如果乙個佇列中元素x後的元素y數值更大,那麼x將失去成為最大值的可能性,故需被移出佇列。
以上即為本題佇列操作方法,最小值同理。
完整**如下:
#include#includeusing
namespace
std;
const
int maxn=1000001
;int item[maxn],line[maxn],element[maxn];//
item存放序號,line為單調數列
intmain()
cout
<<"\n"
; first=1
; last=0;//
兩個單調佇列間過渡的細節不能忘記
for(int i=1;i<=n;++i)//
排序輸出最大值
return0;
}
洛谷 1886 滑動視窗 單調佇列
單調佇列,就是字面意思。如何維護?假設我們是單調減的佇列 維護時,保證所有元素最多進隊一次出隊一次,複雜度o n 我們在隊頭放最大的元素,向右依次遞減。在隊尾插入新元素時,檢查新元素是否比隊尾元素大 是,則刪除隊尾元素,直到 比隊尾元素小時,插入新元素在隊尾。同時還要檢查一下,是否還在視窗範圍內 i...
P1886 滑動視窗 單調佇列
現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...
單調佇列 P1886 滑動視窗
get 單調佇列 現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個...