zoukankan      html  css  js  c++  java
  • 486E

    题意:给一个长度为n的序列。问每一个数关于序列的LIS(longest increasing subsequence)是什么角色。

    这里分了三种:

              1、此数没有出如今随意一条LIS中

              2、此数出如今至少一条可是不是所有的LIS中

              3、此数出如今全部的LIS中

    解法:nlgn的LIS算法能够求出以每一个i位置结束的LIS长度up[i]。

    出如今LIS的数事实上就是一个dag,找出那些某层唯一数值的数即可。LIS算法后,从后向前扫。维护所以长度的最大值,这中间能够推断某长度有几个值,假设某些长度有多个位置则他们都属于2,假设某长度仅仅有一个位置则属于3,其余都是非LIS元素。在推断多个的时候。某个数num[i]能够松弛他的长度位置,条件要保证他比此时help[up[i+1]]的数小,由于这样才干保证他在LIS中(LIS最后一个元素是特判的)。


    代码:

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <cstring>
    #define inf 10000000
    
    using namespace std;
    const int Max=100010;
    int num[Max];
    int up[Max];
    int down[Max];
    int D[Max];
    void getLIS(int num[],int n)
    {
        int last=0;
        for(int i=0; i<n; i++)
        {
            up[i]=lower_bound(D,D+last,num[i])-D+1;
            if(up[i]>last) D[last = up[i]]=num[i];
            D[up[i]-1]=num[i];
        }
    }
    int help[Max];
    int ne[Max];
    int ans[Max];
    int main()
    {
        int n;
        while(cin>>n)
        {
            for(int i=0; i<n; i++)
                scanf("%d",num+i);
            getLIS(num,n);
            int ma=0;
            for(int i=n-1; i>=0; i--)
                ma=max(ma,up[i]);
            for(int i=n-1; i>=0; i--)
            {
                if(up[i]==ma)
                {
                    if(help[up[i]]==0)
                        ans[i]=3,ne[ma]=i;
                    else
                    {
                        ans[i]=2;
                        ans[ne[ma]]=2;
                        ne[ma]=i;
                    }
                    help[up[i]]=num[i];
                }
                else
                {
                    if(num[i]>=help[up[i]+1])
                        ans[i]=1;
                    else
                    {
                        if(help[up[i]]==0)
                            ans[i]=3,ne[up[i]]=i;
                        else
                        {
                            ans[i]=2;
                            ans[ne[up[i]]]=2;
                            ne[up[i]]=i;
                        }
                        help[up[i]]=num[i];
                    }
                }
            }
            for(int i=0; i<n; i++)
                cout<<ans[i];
            cout<<endl;
        }
        return 0;
    }

  • 相关阅读:
    MySQL 大表优化方案
    mysql千万级大数据SQL查询优化
    mysql binlog格式
    MySQL误操作后如何快速恢复数据
    mysql数据库优化
    查看MYSQL数据库中所有用户及拥有权限
    MySQL如何优化
    MySQL 开发实践
    show slave各项参数解释
    MYSQL主从数据库搭建
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5144772.html
Copyright © 2011-2022 走看看