头发不好的一天
农夫约翰的一些 N 头奶牛(1 ≤ N ≤ 80,000 头)的头发很糟糕!由于每头奶牛都对自己凌乱的发型有自知之明,FJ想数一数能看到其他奶牛头顶的其他奶牛的数量。
每头奶牛我都有一个指定的高度h我(1 ≤h我≤ 1,000,000,000),并且站在一排奶牛中,全部面向东方(在我们的图表中右侧)。因此,奶牛 i 可以看到她面前奶牛的头顶(即奶牛 i+1、i+2 等),只要这些奶牛严格比奶牛 i 短。
请看这个例子:
=
= =
= - = Cows facing right -->
= = =
= - = = =
= = = = = =
1 2 3 4 5 6
奶牛 #1 可以看到奶牛 #2、3、4 的发型 奶牛#2看不到奶牛的发型 奶牛#3可以看到奶牛#4的发型 奶牛#4 看不到奶牛的发型 奶牛#5可以看到奶牛6的发型 奶牛#6根本看不到奶牛!
让c我表示从奶牛 i 可以看到其发型的奶牛数量;请计算 C 的总和1通过cN.对于此示例,期望的答案是 3 + 0 + 1 + 0 + 1 + 0 = 5。
输入描述
第 1 行:奶牛数量,N。
2号线...N+1:行 i+1 包含一个整数,该整数是奶牛 i 的高度。
输出描述
第 1 行:一个整数,它是 c 的总和1通过cN.
用例输入 1
6
10
3
7
4
12
2
用例输出 1
5
这道题虽然是一个简单的单调栈,但对于它到底为什么要用单调栈可以求出结果却疑惑了挺久;
这道题求的不是这个数能看见多少给数;而是这个数能被多少给数看见
#include<iostream> #include<algorithm> #include<stack> using namespace std; #define int long long const int N=1e7+7; int a[N]; signed main(){ int sum=0; int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } stack<int> st; for(int i=0;i<n;i++){ while(st.size()!=0&&st.top()<=a[i]) st.pop(); sum+=st.size();//因为求的是这个数能被几个数看见;所以不能加这个数本身 st.push(a[i]); } cout<<sum; }