题意:一排牛,每头牛只可以看到自己右边连续的比自己矮的牛,求所有的牛看到的牛的数量和。
解法:裸的单调栈;
代码:
/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
using namespace std;
int num[100000];
int tool[100000];
int n;
int main()
{
cin>>n;
for(int i=n-1;i>=0;i--)
scanf("%d",num+i);
int p=0;
long long ans=0;
for(int i=0;i<n;i++)
{
while(p>0&&num[i]>num[tool[p-1]])
p--;
if(p==0) ans+=i;
else ans+=i-tool[p-1]-1;
tool[p++]=i;
}
cout<<ans<<"\n";
return 0;
}