这道题目要求我们计算每个同学能看到的同学总数,也就是计算队列的整齐程度。可以使用单调栈来解决这个问题。
对于每个同学,我们需要知道他能看到的所有同学。具体来说,同学i能看到他右边的所有比他矮的同学,直到遇到比他高的同学或者遇到队列的末尾。
为了解决这个问题,我们可以使用单调栈来维护一个递减的栈。通过栈来记录每个同学的高度,以及他能看到的同学数目。
N个同学排成一列,最理想的情况是按身高从小到大排列,这样每个人的视线都不会被遮挡,可以看到他前面的所有人。但由于同学们没有那么听话,可能会出现高个子同学排在前面的情况,导致后面的同学视线被遮挡。
多多想用一个指标来衡量队列的整齐程度:每个同学能看到的同学的总数,这个值越大,说明队列越整齐。请你帮多多计算一下
具体来说,对于第1个同学,如果第i+1、i+2、i+3个同学都比他矮,i+4个同学比他高(或一样高),则他能看到4个同学,但由于视线被遮挡,第i+5、i+6...、i+x个同学都无法再看到(即便第i+x的身高比i+4高)
第一行一个整数N,表示同学的数量(1<=N<=100000)
第二行包含N个整数h1,h2…,hn,表示每个同学的身高(1<=hj<=1000000000)
输出一个整数,表示队列的整齐程度:所有同学能看到同学的总数
输入
6
10 7 4 8 2 1
输出
11
第一名同学(高度为10),能看到其右边五个同学,共5个
第二名同学(高度为7),能看到第三、四名同学,共2个
第三名同学(高度为4),能看到第四名同学,共1个
第四名同学(高度为8),能看到第五、六名同学,共2个
第五名同学(高度为2),能看到第六名同学,共1个
总共5+2+1+2+1=11