题目描述
Farmer John的奶牛在风中凌乱了它们的发型……
每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。对于奶牛i来说,如果奶牛i+1,i+2,……,N这些奶牛的身高严格小于奶牛i,则奶牛i可以看到它们凌乱的发型。
比如下面这个例子:
* * * * = *
= * * * = *
= * - * = * 奶牛面向这边-->
= * = * = *
= - = = = *
= = = = = =
1 2 3 4 5 6
('*'表示空的,这是译者为了格式特意弄的,原题没有)
令ci表示第i只奶牛能够看到的发型数量,请计算c1 + c2 + c3 + … + cN的值
对于上面这个例子,答案为3 + 0 + 1 + 0 + 1 + 0=5。
输入
第一行:奶牛数量N
第二到N+1行:第i+1行输入奶牛i的身高
输出
第一行:一个整数即c1到cN的和
样例输入
6
10
3
7
4
12
2
样例输出
5
#include<iostream>
#include<stack>
using namespace std;
const int N=1e6+10;
long long a[N];
int main(){
long long n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
stack<int>s;
s.push(a[1]);
long long k=0;
for(int i=2;i<=n;i++){
while(!s.empty()&&s.top()<=a[i])
s.pop();
k+=s.size();
s.push(a[i]);
}
cout<<k<<endl;
return 0;
}