最大值(單調棧)

2021-10-11 01:14:50 字數 2920 閱讀 9776

時間限制: 1 sec 記憶體限制: 128 mb

[提交] [狀態]

題目描述

給出n個整數,和乙個長度值len,要求在這n個整數中每個長度為len的連續一段數中的最大值。

例如:n=8,len=3,8個整數是:2 5 1 1 2 4 7 1。答案是 5 5 2 4 7 7 。

解釋:2 5 1的最大值是5

5 1 1的最大值是5

1 1 2的最大值是2

1 2 4的最大值是4

2 4 7的最大值是7

4 7 1的最大值是7

輸入第一行2個正整數:n,len。n範圍[2…100000],len範圍[2…n]

第二行:n個正整數,每個數範圍[1…1000000000]。

輸出一行,n-len+1個整數。

樣例輸入 copy

4 37 2 1 4

樣例輸出 copy

7 4思路看第二個**吧。還是說一下吧:簡單來說就是單調棧思想;

用乙個陣列指區間值的下標(因為要求最大值也就是如果這個數大於這個陣列的最後一位的話就替換下來,如果小於就把這個數存放到裡面)。

我說的有點不明白參考一下人家說的吧:

插入:為了保證單調佇列的遞減性,我們在插入元素xx(struct x型別)的時候,要將隊尾的元素和xx的a成員(表示該元素的資料)比較,如果隊尾的元素不大於a,則刪除隊尾的元素,然後繼續將新的隊尾的元素與a比較,直到隊尾的元素大於a,這個時候我們才將xx插入到隊尾。

刪除:由於我們只需要儲存len個元素中的最大值,所以當隊首的元素的下標小於等於i-len的時候,就說明隊首的元素對於求最大值已經沒有意義了。(注意不是每經過乙個迴圈後就刪除隊首元素,而是要根據隊首元素的下標來確定,因為有時單調佇列中的元素不一定是len個)所以當index<=i-len時,將隊首元素刪除。

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using namespace std;

const

int maxn=

2e6+

1010

;#define inf 0x3f3f3f3f

const

int mod=

1000000007

;const

int mod=

10007

;inline

intread()

priority_queue

, greater

> mn;

//上 小根堆 小到大

priority_queue

, less

> mx;

//下 大根堆 大到小

mapmp;

ll n,m,t,l,r,p;

ll sum,ans,res,cnt,flag,maxx,minn;

bool isprime[maxn]

;ll a[maxn]

,b[maxn]

,c[maxn]

;ll dis[maxn]

,vis[maxn]

,head[maxn]

;ll dp[

1010][

1010];

intmain()

cout<]<<

" ";

for(

int i=m+

1,j=

1;i<=n;i++

,j++

)return0;

}

**二:

#include 

#include

#include

#include

#include

#include

#include

#include

typedef long

long ll;

using

namespace std;

const

int maxn=

2e6+

1010

;#define inf 0x3f3f3f3f

const

int mod=

1000000007

;const

int mod=

10007;

inline int

read()

priority_queue

, greater

> mn;

//上 小根堆 小到大

priority_queue

, less

> mx;

//下 大根堆 大到小

mapmp;

ll n,m,t,l,r,p;

ll sum,ans,res,cnt,flag,maxx,minn;

bool isprime[maxn]

;ll a[maxn]

,b[maxn]

,c[maxn]

;ll dis[maxn]

,vis[maxn]

,head[maxn]

;ll dp[

1010][

1010];

intmain()

cout<

]<

<

" ";

for(

int i=m+

1,j=

1;i<=n;i++

,j++

)return0;

}

51Nod 1349 最大值(單調棧)

1349 最大值 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還...

51nod 1349 最大值 單調棧

有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還能做嘛?小b經過七七四十九天的思考,終於完美的解決了這道題目,這次,他想也讓小c嚐嚐苦頭,於是他問小c...

51nod 1349 最大值(單調棧)

有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還能做嘛?小b經過七七四十九天的思考,終於完美的解決了這道題目,這次,他想也讓小c嚐嚐苦頭,於是他問小c...