CF1437D

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;
}
原文地址:https://www.cnblogs.com/ForeverOIer/p/14170001.html