單調棧是個什麼概念呢?
其實說白了它就是個棧這是廢話
咳,舉個栗子:
因為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]的和
610374122
輸入解釋:
六頭牛排成一排,高度依次是 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 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...