///单调栈 #include<stdio.h> #include<stdlib.h> #include<iostream> #include<string.h> #include<cstring> #include<string> #include<algorithm> #include<math.h> #include<queue> #include<set> #define LL long long #define inf 0x3f3f3f3f #define mod 1e9+7 using namespace std; const int maxn=80005; int s[maxn],top=0,N=0; ///把要求作一下转换(这个是最重要的),其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。 ///从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除, ///此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量。把这个数量加在一起,就可以得到最后的答案了。 int main() { int num=0; LL ans=0; scanf("%d",&N); while(N--){ scanf("%d",&num); while(top>0&&s[top-1]<=num)top--; ans+=top; s[top++]=num; } printf("%lld\n",ans); return 0; }