原题链接
题意:
思路:
力推聚聚博客
确实很思维。
记录每个人第几次被打死的,那么n个人的最大值就是答案。
一个人y如果想被打死,他左边要有一个比他大的数,记作x,那么从x到y的过程,y的次数就是x到y的最大值+1。因为不能只能打死相邻的人,所以要等到x到y之间的人都被打死之后y才能被打死,也就是x到y之间的人的最大次数+1。
用单调栈维护,要注意栈为空的情况。
代码:
int a[maxn],n;
struct node{
int val,step;
};
stack<node>stk;
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
int res=0;
for(int i=1;i<=n;i++){
int t=0;
while(stk.size()>0&&stk.top().val<a[i]){
t=max(t,stk.top().step);
stk.pop();
}
if(stk.empty()) stk.push({a[i],0});
else stk.push({a[i],t+1});
res=max(res,stk.top().step);
}
out(res);
return 0;
}