poj3250 Bad Hair Day
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 }