POJ-3250
题目链接:http://poj.org/problem?id=3250
为什么说比较简单,因为只要从右向左维护单调性就可以,然后就可以通过加减法来找出每个牛可以看到其他牛头顶的数目的和,这里关于什么是单调栈不再赘述
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
stack<int> s;
typedef long long ll;
ll a[100000],b[100000];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>a[i];
while(s.size())
s.pop();
for(int i=n;i>=1;i--){
while(s.size()&&a[i]>a[s.top()])
s.pop();
if(s.empty())
b[i]=n+1;
else
b[i]=s.top();
s.push(i);
}
ll num=0;
for(int i=1;i<n;i++)
num+=b[i]-i-1;
cout<<num<<endl;
return 0;
}