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