單調棧 fzu 2136取糖果

2021-08-04 17:04:31 字數 1171 閱讀 8133

problem 2136 取糖果

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

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

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

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

151 3 2 4 5

13345

submit

back

status

discuss

題意:隨意抽連續的x袋糖果,所得即為這x袋中的最大的那一袋的糖果數;問當連續取 i :1~n袋糖果時,取 i 袋最少得到多少糖果;

思路:最小化最大值嘛,先把各個數字作為最大值的最大區間長度求出來(單調遞減棧),然後根據區間長度來找到對應的所有值中的最小值,區間長度大的一定也滿足長度小呢;用單調棧想把柱形圖畫出來;

比如:區間長度為5對應的值的最小值為7,而區間長度為2的對應的值為12;那麼要取2袋的化,肯定是輸出7呀;所以把最後得到的區間長度對應的值從大到小更新一下最小值即可;

**:

#include#include#include#includeusing namespace std;

#define inf 1000000007

#define ll long long

#define n 100010

int q[n],w[n];

int f[n];

stackst;

int main()

q[++top]=h;

w[top]=cnt+1;

}st.push(h);

}for(int i=n-1; i>=1; i--)

f[i]=min(f[i],f[i+1]);

for(int i=1; i<=n; i++)

printf("%d\n",f[i]);

}return 0;

}

(單調棧)FZU 2136 取糖果

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

fzu 2136 鍊錶

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

單調棧 模板 單調棧模板

biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...