fzu 2136 鍊錶

2022-02-16 11:03:03 字數 1174 閱讀 8797

problem 2136 取糖果

有n個袋子放成一排,每個袋子裡有一定數量的糖果,lzs會隨機選擇連續的幾個袋子,然後拿走這些袋子中包含最多糖果的袋子。現問你,在選擇x個袋子的情況下,lzs最壞情況下,也就是最少會拿到多少個糖果?對於x取值為1到n都分別輸出答案。

第一行乙個整數t,表示有t組資料。

每組資料先輸入一行乙個整數n(1<=n<=100000),表示袋子數,接下來一行輸入n個正整數,輸入的第i個數表示第i個袋子所裝的糖果數。

每組資料輸出n行,第i行表示lzs隨機取連續的i個袋子時的最壞情況下能拿到的糖果數。15

1 3 2 4 513

345

在眾神題解的關照下,終於想通且a了。

演算法:①按元素值從小到大依次求出每個元素所在的連續最長區間長度,使該元素在這個區間內最大,②然後因為是列舉每個元素的最長區間長度的,需要ans[len]=min(ans[len], ans[len+1]).

第②步的正確性?

1.當len=1時,則ans[1] = min(e[i]),i從0,到n-1,e[i]為第i個元素;

2.當len=n時,則ans[n] = max(e[i]), 同上;

3.當len取其它值設為k,若某個元素可達區間長度為bk,且bk>k, 則該元素一定是某些(個)區間長度為k的區間內最大值, 所以ans[k] =min(ans[i]) 對所有大於k的i。

accepted:

#include#include#includeusing namespace std;

const int maxn = 111111;

const int inf = 1 << 30;

int lft[maxn], rit[maxn];

int e[maxn], ind[maxn], n;

int lcnt[maxn], rcnt[maxn]; //模擬雙向鍊錶

int ans[maxn];

bool cmp(const int a, const int b)

int main()

//...

for(int i=n-1; i; i--) ans[i]=min(ans[i], ans[i+1]);

for(int i=1; i

}return 0;

}

單調棧 fzu 2136取糖果

problem 2136 取糖果 有n個袋子放成一排,每個袋子裡有一定數量的糖果,lzs會隨機選擇連續的幾個袋子,然後拿走這些袋子中包含最多糖果的袋子。現問你,在選擇x個袋子的情況下,lzs最壞情況下,也就是最少會拿到多少個糖果?對於x取值為1到n都分別輸出答案。第一行乙個整數t,表示有t組資料。每...

(單調棧)FZU 2136 取糖果

有n個袋子放成一排,每個袋子裡有一定數量的糖果,lzs會隨機選擇連續的幾個袋子,然後拿走這些袋子中包含最多糖果的袋子。現問你,在選擇x個袋子的情況下,lzs最壞情況下,也就是最少會拿到多少個糖果?對於x取值為1到n都分別輸出答案。input 第一行乙個整數t,表示有t組資料。每組資料先輸入一行乙個整...

鍊錶 環形鍊錶

環形鍊錶也叫迴圈鍊錶 可以是雙鏈表 也可以是單鏈表 操作原理和單鏈表差不多,只是最後乙個節點不在指向空 null 而是頭 head 這裡以單鏈表舉例 description 環形鍊錶 author lzq date 2018 11 3 20 46 version 1.0 public class a...