顧名思義,單調的棧,可遞增或遞減,主要用於求解nge問題(next greater element)
4 > 1,彈出1,棧為空,壓入4
2 < 4,壓入4
3 > 2,彈出2,3 < 4,壓入4
5 > 3,彈出3,5 > 4,彈出4,棧為空,壓入5
可以發現,每當有數被彈出時,將要入棧的數就是第乙個比彈出的數大的數
模板題,無背景。2019.12.12 更新資料,放寬時限,現在不再卡常了。
給出項數為 n 的整數數列 a_a1…n。
定義函式 f(i)f(i) 代表數列中第 ii 個元素之後第乙個大於 a_ia**i 的元素的下標,即 f(i)=\min_ f(i)=mini
a**i。若不存在,則 f(i)=0f(i)=0。
試求出 f(1\dots n)f(1…n)。
第一行乙個正整數 nn。
第二行 nn 個正整數 a_a1…n。
一行 nn 個整數 f(1\dots n)f(1…n) 的值。
輸入 #1複製
輸出 #1複製5
1 4 2 3 5
【資料規模與約定】2 5 4 5 0
對於 30%30% 的資料,n\leq 100n≤100;
對於 60%60% 的資料,n\leq 5 \times 10^3n≤5×103 ;
對於 100%100% 的資料,1 \le n\leq 3\times 10^61≤n≤3×106,1\leq a_i\leq 10^91≤a**i≤109。
#include #define maxn 3000000
int n, ans[maxn + 10], cnt = 0;
// 將值和索引關聯
struct node stack[maxn + 10], a;
int main()
// 壓入元素
cnt++;
stack[cnt] = a;
} for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
return 0;
}
資料結構與演算法 (3)單調棧
單調棧即滿足單調性的棧,在單調棧中,從棧頂到棧底的元素是嚴格遞增或者遞減的。單調棧的維護是o n o n o n 的時間複雜度的,因為所有的元素只會進棧一次且出棧後再也不會進棧了。單調棧中元素進棧的過程如下 分析 如上圖所示,當遍歷到某些柱子時,當前柱子會和之前的某個柱子形成凹坑而接住雨水。當柱子數...
資料結構 單調棧與單調佇列
830.單調棧 154.滑動視窗 79.滑動視窗的最大值 單調棧的應用場景 求最近的最值 單調佇列的應用場景 求滑動視窗內的最值 單調佇列步驟 值得注意的是單調佇列存的是下標,方便判斷隊頭是否滑出視窗 1.判斷隊頭是否滑出視窗 2.判斷完之後那麼隊頭就是滑動視窗的最值,處理題目邏輯 順序不一定在2,...
資料結構 單調棧與單調佇列
單調棧是棧內元素具有嚴格單調性的一種資料結構。由於我們要找到每個數左邊第乙個比它小的數,那麼我們便可以發現 對於棧中任意乙個數,如果在它右邊存在乙個數比它小 或相等 那麼這個數便是不可能被選中的,直接彈出棧即可。於是我們便可以進行如下操作 按序列舉每乙個數,準備將當前這個數壓棧時,從棧頂開始遍歷,如...