戰爭遊戲的至關重要環節就要到來了,這次的結果將決定王國的生死存亡,小b負責首都的防衛工作。首都處於乙個四面環山的盆地中,周圍的n個小山構成乙個環,作為預警措施,小b計畫在每個小山上設定乙個觀察哨,日夜不停的瞭望周圍發生的情況。
一旦發生外敵入侵事件,山頂上的崗哨將點燃烽煙。若兩個崗哨所在的山峰之間沒有更高的山峰遮擋且兩者之間有相連通路,則崗哨可以觀察到另乙個山峰上的烽煙是否點燃。由於小山處於環上,任意兩個小山之間存在兩個不同的連線通路。滿足上述不遮擋的條件下,一座山峰上崗哨點燃的烽煙至少可以通過一條通路被另一端觀察到。對於任意相鄰的崗哨,一端的崗哨一定可以發現一端點燃的烽煙。
小b設計的這種保衛方案的乙個重要特性是能夠觀測到對方烽煙的崗哨對的數量,她希望你能夠幫她解決這個問題。
輸入輸入中有多組測試資料。每組測試資料的第一行為乙個整數n(3<=n
<=10^6),為首都周圍的小山數量,第二行為n個整數,依次表示小山的高度h,(1<=h<=10^9)。
輸出對每組測試資料,在單獨的一行中輸出能相互觀察到的崗哨的對數。
樣例輸入
51 2 4 5 3
樣例輸出
7利用單調棧,採用棧底到棧頂從大到小,記錄山峰高度和出現的次數,從環的乙個最大值開始壓棧,然後開始記錄
如圖的棧結構中,k個5,m個4,n個3,當遇到下乙個5時,
3出棧,山峰對數為 cn
2 + n * 2
4出棧,山峰對數為 cm
2 +m * 2
5出現的次數由 k -> k + 1
當m=1,即只出現了一次,則為 2對
當環遍歷完之後,棧中還存在元素k個5,m個4,n個3,
則倒數第3,4,5.....的結算規則依然是cn
2 + n * 2
倒數第二條記錄 有多少對,要先考慮倒數第一條記錄有多少個(k個),
當k>1時,cn
2 + n * 2,
當k=1時,為cn
2 + n * 1,
倒數第一條記錄:cn
單調棧玩法 烽火台
具體問題是 n 個 烽火台圍成乙個圈,任意兩個烽火台只要中間的烽火台比他們兩個都低就能看見彼此,當然相鄰的肯定能看見對面,求能看見彼此的對數。我們第一步就是找出這一圈數值中的最大值。為什麼?因為這樣我們就能確保後面的數向左至少和最大值能配成一對烽火台,我們只要觀察右邊的即可。前面迴圈可知value是...
資料結構 單調棧
上班無事,刷力扣發現了個新名詞 單調棧 題目 496.下乙個更大元素 i 名字上就聽的出來,單調棧中存放的資料應該是有序的,所以單調棧也分為單調遞增棧和單調遞減棧 單調遞增棧 棧中資料出棧的序列為單調遞增序列 單調遞減棧 棧中資料出棧的序列為單調遞減序列 ps 這裡一定要注意所說的遞增遞減指的是出棧...
資料結構 單調棧
這是筆者的第一篇部落格,由於筆者自身水平的限制。用詞可能不夠準確,句子不太通順,水平可能也不太行,敬請指出,感激不盡!我們都知道棧 stack 是一種先入後出的資料結構,而單調棧建立在棧的基礎上,它區別於普通的棧的特殊之處在於 棧中的元素一直保持著單調遞增 單調遞減的關係 比如單調遞增棧中的元素自棧...