单调栈的基础应用。我们以矩形高度为单位建立一个单调不降的栈,每次输入一个新的矩形高度 h 时,如果新的高度比栈顶高度低,则一直 pop,并累计 pop 出的元素的宽度,每次 pop 我们都可以看做得到一个高度为 h,宽度为累计总宽度的一个矩形(可以看做是把这段的所有矩形高度都削减为 h),用它的面积更新答案。pop 结束后将我们最终得到的新矩形入栈即可。
因此我们可以使用队列模拟,每次 pop 出队首,表示此人已办理完毕。接下来找一个人放到队列中作为下一个要办理的人。而下一个的人选是有要求的,即优先寻找一个到达时间不晚于自己离开时间的朋友,让他排在自己后面(插队),如果找不到则按原顺序找自己后面的第一个人,让他排在自己后面。这样不断循环并累加等待时间,直到队列为空即可。