HDU3415單調佇列

2021-05-23 19:06:01 字數 517 閱讀 8751

這題是單調佇列的典型運用。

至於單調佇列,就是乙個雙端佇列,在隊首(f)出隊,在隊尾(b)出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的元素如果不在範圍內了,就判斷隊首的元素id是否是這個左邊的id,是的話就出隊,否則就不管。關於元素入隊,首先判斷入隊的元素是否大於隊尾的元素(保證佇列單調遞增),如果不大於,那麼彈出隊尾元素,直到隊尾元素小於入隊元素或者隊列為空。

列舉sum[i]表示前i個元素的和,注意這裡為了實現迴圈的序列要將n擴充套件到2*n。

然後列舉每乙個sum[i],找到i之前k個元素[i-k,j]區間內的sum最小值sum[k],sum[i]-sum[k]就是最優解,然後取全域性最優解即可。

注意一點在佇列中在處理佇列之前就要先將i-k-1號元素刪除,我們要在佇列維護最多k+1個元素,然後去最值,最後才將sum[i]入隊。

複雜度o(n)。

我的**:

HDU 3415單調佇列

這個題目屬於常見題型,給定一組環狀數列,求出其中長度不超過k的數字之和的最大值。用到了字首和的技巧,比如要求i,j間所有數字之和,可以提前在輸入的時候計算出從0 i的數字之和及從0 j的數字之和,那麼sum i j sum j sum i 現在的問題是求出最大的sum i j 那麼我們可以固定sum...

HDU3415單調佇列

這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...

HDU 3415 單調佇列

求長度不大於 k 的最大子段和 求字首和,列舉答案的右端點,對於每個右端點,求以該點為右端點,長度為 k 的區間的最小值 用單調佇列維護值單調遞增的下標,對於每個右端點,若隊首元素與當前位置的距離不滿足要求,則出隊,否則記錄答案 includeusing namespace std typedef ...