關於單調棧

2021-09-19 15:27:18 字數 1450 閱讀 3848

單調棧是個什麼概念呢?

其實說白了它就是個棧這是廢話

咳,舉個栗子:

因為2比3小,所以直接砍掉;

然後2比1大,所以2就待在1上面。

也就是說棧裡存著乙個單調序列。

那麼單調棧有啥用呢?

我們來看個例題:

農民john的某 n 頭奶牛 (1 <= n <= 80,000) 正在過亂頭髮節!由於每頭牛都 

意識到自己凌亂不堪的髮型, 

fj 希望統計出能夠看到其他牛的頭髮的牛的數量。 

每一頭牛 i有乙個高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向東方排成 

一排(在我們的圖中是向右)。因此,第i頭牛可以看到她前面的那些牛的頭, 

(即i+1, i+2,等等),只要那些牛的高度嚴格小於她的高度。 

例如這個例子: 

牛#1 可以看到她們的髮型 #2, 3, 4 

牛#2 不能看到任何牛的髮型 

牛#3 可以看到她的髮型 #4 

牛#4 不能看到任何牛的髮型 

牛#5 可以看到她的髮型 6 

牛#6 不能看到任何牛的髮型! 

讓 c[i] 表示第i頭牛可以看到髮型的牛的數量;請輸出 c[1] 至 c[n]的和。 

如上面的這個例子,正確解是3 + 0 + 1 + 0 + 1 + 0 = 5。 

* line 1: 牛的數量 n。 

* lines 2..n+1: 第 i+1 是乙個整數,表示第i頭牛的高度。 

* line 1: 乙個整數表示c[1] 至 c[n]的和

6103

74122

輸入解釋:

六頭牛排成一排,高度依次是 10, 3, 7, 4, 12, 2。

5
先考慮暴力演算法是如何做的,當前元

素一直向右找,當遇到乙個比它大的元素則退

出,於是我們可以維護乙個單調下降的棧即可,

當前元素如果大於等於棧頂元素,則棧頂元素

沒有存在的必要了,將當前元素壓入棧,在進

棧前,統計下當前棧有多少個元素即可,這意味

著當前進棧的元素能被多少元素看到。

**:

#includeusing namespace std;

long long n, h[80010];

long long st[80010], top;

long long ans;

int main()

for (long long i = 1; i <= n; i++)

printf("%lld", ans);

return 0;

}

關於單調棧

單調棧 單調遞增或單調減的棧,主要通過push和pop兩個操作巧妙的解決一些有關序列的問題。include include include include define ll long long using namespace std const int mod 998244353 const in...

關於單調佇列的個人理解

一 何為單調佇列?1 首先搞懂,什麼是佇列 佇列是一種資料結構,兩個埠,乙個埠進元素,乙個埠出元素,那麼,根據這種操作的定義,不難發現 佇列具有 先進先出 的性質 2 單調佇列 單調佇列,顧名思義,具有的單調性的佇列,即佇列中的元素按照某種特徵有一定的順序。比如單調遞增的佇列,單調遞減的佇列。3 舉...

單調棧 模板 單調棧模板

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