Solution:
这道题里面有一个性质,(a[i]<a[k];,;i>k) 那么 节点 (i) 和节点 (k) 肯定不能有同一个父节点,因为保证输入过程是升序的。然后呢,我们就可以找一段最长的升序序列且没有被其他的点选择过的,我们就可以把这些点放在一层。可以看出这样肯定是最优的。
Code:
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-') f=0;c=getchar();}
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return f?x:-x;
}
const int N=2e5+10;
int T,n,a[N],dep[N],ans,pos;
queue<int>q;
int main()
{
T=read();
while(T--)
{
n=read();
q.push(1); dep[1]=0; pos=2; ans=0;
for(int i=1;i<=n;i++) a[i]=read();
while(!q.empty())
{
int x=q.front(); q.pop();
ans=max(ans,dep[x]);
int j;
for(j=pos+1;j<=n;j++)
if(a[j]<a[j-1]) break;
if(pos>n) j=pos;
for(int i=pos;i<j;i++)
{
dep[a[i]]=dep[x]+1;
q.push(a[i]);
}
pos=j;
}
printf("%d
",ans);
}
return 0;
}