单调栈
栈底维护的是目前身高最高的人,因为在此人前的人因为此人的存在不能与后来的人联系了,所以如果遇到身高高的人就不断让比他身高矮的人出栈即可。不过我们还要留意身高相同的情况。
由于要考虑重复的情况,用单调队列时将高度相同的人挤掉(统计答案)之后还要再加上去,这种情况遇到所有人身高相同的时候就退化成了O(n^2)的算法了,T了三个点。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <vector>
#include <iostream>
#include <map>
using namespace std;
inline int read(){
int x = 0, op = 1; char ch = getchar();
while (!isdigit(ch)){
if (ch == '-') op = -1; ch = getchar();}
while (isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * op;
}
inline void write