天氣變化 單調棧的簡單應用

2021-08-22 11:56:26 字數 1233 閱讀 9139

總結:給出乙個序列,讓你求每乙個數字左/右第乙個比它大/小的數

總共有4種情況:(單調遞增減從棧底開始)

這裡的單調是指從棧底到棧頂的單調性(好像與一般的定義反了)

右大:單調遞減棧

右小:單調遞增棧

左大:單調遞減棧

左小:單調遞增棧

description

給你乙個n天的天氣氣溫表, 你需要輸出對於每一天,至少需要多少天才能公升溫,如果不會公升溫,這一天輸出0。

input

輸入第一行n代表天數。第二行n個數a[i]代表當天氣溫。1 <= n <= 1,000,000a[i] < 1,000,000

output

一行輸出n個整數。第i個整數代表對於第i天還需要多少天才能公升溫。行末不要有多餘空格。

思路:單調棧的應用之一,求某個數字最左邊或者最右邊比它大或小的位置.

#include #include #include #include #include #include #include #include #include #include #include #include #define eps 1e-8

#define inf 0x3f3f3f3f

#define mod 1e9+7

#define pi acos(-1)

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define clr(x,y) memset((x),y,sizeof(x))

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int seed = 131;

const int maxn = 1e6 + 5;

int n;

stacks;//單調遞減棧

int a[maxn];

int ans[maxn];

int main()

s.push(n);

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

for(int i = 1; i < n; i++) printf("%d ", ans[i]);

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

return 0;

}

單調棧解木板倒水問題(單調棧的簡單應用)

題目描述 地上從左到右豎立著 n 塊木板,從 1 到 n 依次編號,如下圖所示。我們知道每塊木板的高度,在第 n 塊木板右側豎立著一塊高度無限大的木板,現對每塊木板依次做如下的操作 對於第 i 塊木板,我們從其右側開始倒水,直到水的高度等於第 i 塊木板的高度,倒入的水會淹沒 ai 塊木板 如果木板...

矩陣單調棧用法 簡單應用

題目 largest rectangle in a histogram 單調棧此時退棧,知道可以加進去圖中最後乙個小的,但是此時也就相當於在實際面積中算了乙個紅色區域,因為要邊算面積,邊退棧 然後就是新入棧的寬應該是紅色的寬度,也就是退棧時記錄的width 1 include include inc...

矩陣單調棧用法 簡單應用

題目 largest rectangle in a histogram 單調棧此時退棧,知道可以加進去圖中最後乙個小的,但是此時也就相當於在實際面積中算了乙個紅色區域,因為要邊算面積,邊退棧 然後就是新入棧的寬應該是紅色的寬度,也就是退棧時記錄的width 1 include include inc...