思路:和上题目类似,在最后一个数后设置一个哨兵即可。每次多计算一头牛,所以最后还要删去。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<string> #include<queue> #include<map> #include<stack> #define L1 long long #define L2 __int64 #define inf 0x3f3f3f3f using namespace std; const int m1=1001000; const int m2=1010; int head[m1],vex[m1],arr[m1]; bool vis[m2][m2]; int ans[110000]; struct node { int a,id; }q[100000]; int main() { int n,m,i,j,k; while(~scanf("%d",&n)) { for(i=1;i<=n;i++){ scanf("%d",&q[i].a); q[i].id=i; } ++n; q[n].a=inf; q[n].id=n; stack<node>Q; Q.push(q[1]); long long ans=0; for(i=2;i<=n;i++){ while( !Q.empty()&&(Q.top().a<=q[i].a) ) { node t=Q.top(); Q.pop(); ans+=q[i].id-t.id-1; } Q.push(q[i]); } printf("%lld\n",ans); } return 0; }