題目連結:http://www.lydsy.com/JudgeOnline/problem.php?id=1660
題意:
有n頭牛,身高分別為h[i]。
它們排成一排,面向右邊。第i頭牛可以看見在它右邊的牛j,只要h[i] > h[j],且中間沒有身高 >= h[i]的牛擋住視線。
第i頭牛能看見c[i]只別的牛。
問你 ∑ c[i]為多少。
題解:
單調棧。
單調性:
棧記憶體牛的編號。
從棧底到棧頂,h[i]單調遞減。
從左到右列舉每頭牛。
如果列舉到第i頭牛時,棧內的某頭牛k滿足h[i] >= h[k],被彈出,則k的視野的最右端為i-1。
所以c[k] = k-i-1。即:ans += k-i-1。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stack> 5 #define MAX_N 80005 6 #define INF_LL 100000000000000000LL 7 8 using namespace std; 9 10 int n; 11 long long ans=0; 12 long long h[MAX_N]; 13 stack<int> stk; 14 15 void read() 16 { 17 cin>>n; 18 for(int i=0;i<n;i++) 19 { 20 cin>>h[i]; 21 } 22 } 23 24 void solve() 25 { 26 h[n]=INF_LL; 27 for(int i=0;i<=n;i++) 28 { 29 while(!stk.empty() && h[stk.top()]<=h[i]) 30 { 31 ans+=i-stk.top()-1; 32 stk.pop(); 33 } 34 stk.push(i); 35 } 36 } 37 38 void print() 39 { 40 cout<<ans<<endl; 41 } 42 43 int main() 44 { 45 read(); 46 solve(); 47 print(); 48 }