1660: [Usaco2006 Nov]Bad Hair Day 乱发节
Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1180 Solved: 577
[ Submit][ Status][ Discuss]
Description
Input
* Line 1: 牛的数量 N。
* Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度。
Output
* Line 1: 一个整数表示c[1] 至 c[N]的和。
Sample Input
6
10
3
7
4
12
2
Sample Output
5
和http://blog.csdn.net/jaihk662/article/details/77488664一样都是单调栈
只不过这个只用求其中一侧
把数组反过来维护一个非严格递增的序列即可
#include<stdio.h>
#include<stack>
using namespace std;
#define LL long long
stack<int> st;
LL a[80005];
int main(void)
{
LL n, i, ans;
while(scanf("%lld", &n)!=EOF)
{
ans = 0;
for(i=1;i<=n;i++)
scanf("%lld", &a[i]);
for(i=n;i>=1;i--)
{
while(st.empty()==0 && a[st.top()]<a[i])
st.pop();
if(st.empty()==0)
ans += st.top()-i;
else
ans += n+1-i;
st.push(i);
}
printf("%lld\n", ans-n);
}
return 0;
}