單調佇列 SSL2521

2021-07-25 10:02:56 字數 634 閱讀 5058

description

給出乙個長度為n(1<=n<=100000)的整數序列,選擇長度不超過k(1<=k<=n)的段,使得總和最大。

solution

方法一:列舉左端點l和右端點r,然後掃一遍計算總和並選取最大值。時間複雜度o(n^3)

方法二:預處理sum[i]表示前i個數的和,列舉左端點l和右端點r,然後o(1)計算總和並選取最大值。時間複雜度o(n^2)

方法三:仍然是預處理sum[i]表示前i個數的和,只列舉右端點r,問題就轉換成了在sum[r-k..r-1]中找乙個最小值。那麼我們維護乙個元素單調遞增的佇列,每次處理完乙個r後把隊尾所有不小於sum[r]的元素刪掉後把sum[r]放進隊尾。那麼每次只用把隊頭中元素在原陣列中的下標

#include

#include

using namespace std;

int n,k,q[100002],h,t=1;

long long s[100001],ans=-0x7fffffff;

int main()

printf("%lld",ans);

return

0;}

SSL2521 數數 單調佇列

time limit 10000ms memory limit 65536k total submit 107 accepted 31 case time limit 1000ms description 題目大意 如圖所示 題解 記錄字首和sum i 對於結尾為i的最大和,實際上是在sum j i...

ssl2883 烽火傳遞 單調佇列優化 DP

烽火台又稱烽燧,是重要的軍事防禦設施,一般建在險要或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊 夜晚燃燒乾柴,以火光傳遞軍情,在某兩座城市之間有 n 個烽火台,每個烽火台發出訊號都有一定代價。為了使情報準確地傳遞,在連續 m 個烽火台中至少要有乙個發出訊號。請計算總共最少花費多少代價...

單調棧,單調佇列

大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...