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 }

 

你可能感兴趣的:(AIR)