洛谷 P2866 [USACO06NOV] Bad Hair Day S
题目描述
农夫约翰有 N 头奶牛正在过乱头发节。
每一头牛都站在同一排面朝右,它们被从左到右依次编号为 1,2,⋯,N。编号为 i 的牛身高为 hi。第 N 头牛在最前面,而第 1 头牛在最后面。
对于第 i 头牛前面的第 j 头牛,如果 hi>hi+1,hi>hi+2,⋯,hi>hj,那么认为第 i 头牛可以看到第 i+1 到第 j 头牛。
定义 Ci 为第 i 头牛所能看到的牛的数量。请帮助农夫约翰求出 C1+C2+⋯+CN。
输入格式
输入共 N+1 行。
第一行为一个整数 N,代表牛的个数。
接下来 N 行,每行一个整数 ai,分别代表第 1,2,⋯,N 头牛的身高。
输出格式
输出共一行一个整数,代表 C1+C2+⋯+CN。
//想要找出一头牛可以看见那几头牛比较困难, 我们可以用单调栈来控制当前这头牛可以被几头牛看见 栈中的元素就是可以看见当前牛的个数 只需维护一个单调栈就可以找出所有可以看见当前牛的数量 如果当前牛小于栈顶元素就让他加入栈 否则就计算出当前牛可以被几头牛看见
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,t;
LL ans;
stack <int> a;
int main() {
cin>>n;
for (int i=1; i<=n; i++) {
cin>>t;
while (!a.empty() && a.top() <= t) a.pop(); //如果当前牛的身高高于栈顶元素 就让栈中的牛出栈
ans+=a.size();//计算当前牛可以被几头牛看见
a.push(t);//入栈
}
cout<<ans;
return 0;
}