题目链接
思路:dp【i】表示i这个被删除的次数,我们用单调队列来维护递增序列,当队列内元素小于a【i】时陆续弹出,在我左侧同时又被我弹出说明我肯定是在他们之后才被杀死的,所以这个过程dp维护一下就行。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int n,h=1,top=0,q[maxn],a[maxn],dp[maxn],ans=0,cnt=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
cnt=0;
scanf("%d",&a[i]);
while(h<=top&&q[top]<=a[i]) cnt=max(cnt,dp[q[top]]),top--;
if(top>0) dp[a[i]]=cnt+1;//核心代码,左侧比我小的数一定是在我之前被消灭的
q[++top]=a[i];
}
for(int i=1;i<=n;++i) ans=max(ans,dp[a[i]]);
printf("%d\n",ans);
}