總結:給出乙個序列,讓你求每乙個數字左/右第乙個比它大/小的數
總共有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...