1 //超时代码
2 #include<stdio.h>
3 unsigned ans;
4 int main()
5 {
6 int i,j,n,Q[80000];
7 scanf("%d",&n);
8 for(i=0;i<n;++i)
9 scanf("%d",&Q[i]);
10 for(i=n-1;i>=0;--i){ //从后往前读
11 for(j=i+1;j<n&&Q[i]>Q[j];++j); //从i处往后查找,直到碰到大于等于它的数为止
12 ans+=j-i-1; //把i后小于i的元素个数加到ans中
13 }
14 printf("%lld\n",ans);
15 return 0;
16 }
1 //AC代码
2 #include<stdio.h>
3 unsigned ans; //所求结果最大值为 3199960000,所以需要用无符号整型,其范围为0~4294967296
4 int main()
5 {
6 int i,k,n,a,Q[80000]; //定义一个堆栈,用来模拟单调堆栈,堆栈为从大到小排列
7 scanf("%d",&n);
8 for(i=k=0;i<n;++i){
9 scanf("%d",&a);
10 while(k>0&&Q[k]<=a) //假如栈顶元素小于等于当前值,则退栈,否则入栈
11 k--;
12 ans+=k; //这里的K表示栈中元素个数,也即栈中大于a的元素个数
13 Q[++k]=a; //该元素入栈
14 }
15 printf("%lld\n",ans);//最后输出是需要“%lld”,因为这WA好几次
16 return 0;
17 }