zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    对js数组的splice实现
    前端必读
    命令模式
    访问者模式
    观察者模式
    解释器模式
    装饰器模式
    组合模式
    抽象工厂模式
    搜索结果关键词高亮显示
  • 原文地址:https://www.cnblogs.com/ForeverOIer/p/14170001.html
Copyright © 2011-2022 走看看