A: Bad Hair Day
看到题目首先想到的肯定是朴素方法给每个牛都模拟一遍找,不过这样铁定TLE;
这里可以换个思路:想要求每个牛能在其右边的一个连续序列中有多少比自己矮的数量,可以转换成求每个牛的左边有多少牛能看到自己,范围是一个均大于自身的、从左至右的递减序列。这样就可以用单调栈来求解了:
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 80010;
int stk[N],tt;//栈、栈顶
ll ans;//判断一下知道答案可能爆int
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
//维护一个从左至右的严格递减的序列,所以对于每个x,栈内牛都满足条件
//即答案加上栈内元素数量即可,时间复杂度为O(n)
while(tt && x>=stk[tt])
tt--;
ans+=tt;
stk[++tt]=x;
}
cout<<ans<<endl;
return 0;
}