單調棧的運用

2021-09-24 21:45:35 字數 832 閱讀 1728

單調棧可以用來是實現在 離線的情況下,o(n)的處理出陣列中所有點比某個點小或大最近的距離是多少;

具體做法是用棧來維護一邊的點的下表,由於假如ihj 那麼h【i】便永無出頭之日;可以把他刪了,而在棧裡能找到的直到第一次出現的小與hi的h【j】就一定是最近的,每個點出棧一次,進棧一次,所以時間複雜度是on的;

例題是acwing 131和152

以下給出ac**:

棧沒有用stl而是陣列模擬是因為陣列模擬快很多

#include

#include

using namespace std;

typedef long long ll;

const int maxn=1e5+7;

int h[maxn],l[maxn],r[maxn];

int n;

void get(int a)

}int main()

return 0;

}#include

#include

using namespace std;

const int maxn=1010;

int h[maxn][maxn],l[maxn],r[maxn],stk[maxn],top;

int n,m;

void get(int a,int h)

}int work(int a)

int main()

}int res=0;

for(int i=1;i<=n;i++)res=max(res,work(h[i]));

printf("%d\n",res*3);

return 0;

}

單調棧的運用

單調棧本質上只是單調遞增或遞減的棧,有點類似於單調佇列,但不同之處在於插入乙個元素時,會彈出棧中 所有不符合單調性的元素 來個例子吧!當乙個單增的棧stack 向其中壓入元素6時,stack 向其中壓入元素2時,stack彈出2,3,4,且stack 向其中壓入0時,stack彈出1,2,3,4,s...

單調棧的運用

題目大意 有一群列隊,面朝右站立的牛,輸入每頭牛的身高,如果視線前方有一頭高於自己的牛,則看不到它之後的牛 求出所有牛能看到頭頂的個數。n方演算法超時,故考慮優化,首先能想到的是,在計算左邊的牛能看到多少牛時,可以利用右邊的結果。棧優化的思路即是,從右向左遍歷牛的身高,同時對棧進行操作 棧中存放牛的...

單調棧 模板 單調棧模板

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