• vijos难解的问题(LIS最长上升子序列)


    题目地址https://vijos.org/p/1369

    描述

    在你的帮助下,蔚蓝来到了埃及.在金字塔里,蔚蓝看到了一个问题,传说,能回答出这个问题的人就能受到埃及法老的祝福,可是蔚蓝日夜奋战,还是想不出来,你能帮帮他么?(XXX: 胡扯,教主怎么可能想不出来= _ =||)(WS这人说的=。=)
    问题是这样的: 
    给定一个序列<a1,a2,...,an>.求最长上升子序列(lis)p1<p2<...<pw满足a[p1]<a[p2]<...<a[pw]
    例如65 158 170 299 300 155 207 389
    LIS=<65,158,170,299,300,389>。

    但是,现在还有一个附加条件:求出的最长上升子序列必须含有第K项。

    比如,在上面的例子中,要求求出的最长上升子序列必须含有第6项,那么最长上升子序列就是:65 155 207 389。

    输入

    第一行是用空格隔开的两个正整数N、K,含义同上所述.

    第二行N个数,即给出的序列.

    输出

    仅有一个数,表示含有第K项的最长上升子序列的长度.

    题解:这道题除了需要子序列中包含第k项外,就是一道裸的LIS,那么我们可以这样考虑。以第k项来考虑,若是第k项在最后的子序列中,那么这一项的左边一定小于这一项,这一项的右边一定大于这一项。所以我们可以重新创建一个数组来存储原序列中第k项的左边小于第k项的元素、第k项,第k项右边的大于第k项的元素,这样对这个新序列进行纯LIS求解就可以了。我的代码不是这样写的,不过大体的思路是一样的:将新序列的原来第k项左边的元素求解一次LIS,右边的元素求解一次LIS,两次结果相加再+1就是最后的结果。

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=3e5+10;
    int a[N];
    int f[N]={0};
    int ant[N]={0};
    int b[N];
    int  make(int cnt,int c[]){//cnt是序列c的长度 
        if(cnt==0) return 0;
        memset(f,0,sizeof(f));
        int len=1;
        f[1]=c[0];
        for(int i=1;i<cnt;i++){
            if(c[i]>f[len]){
                f[++len]=c[i];
            }
            else {
                int l=1,r=len;
                while(l<r){
                    int mid=(l+r)>>1;
                    if(f[mid]<c[i]) l=mid+1;
                    else r=mid;
                }
                f[l]=c[i];
                
            }
        }
        for(int i=cnt;i;i--){
            if(f[i]>0) return i;
        }
    }
    
    int main(){
        int n,k;cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>a[i];
        int ans=0;
        int cnt=0;
        for(int i=1;i<k;i++) 
            if(a[i]<a[k]) b[cnt++]=a[i];
        ans+=make(cnt,b);
        cnt=0;
        for(int i=k+1;i<=n;i++)
            if(a[i]>a[k]) b[cnt++]=a[i];
        ans+=make(cnt,b);
        cout<<ans+1;
        return 0;
    } 

    写于:2020/8/22 16:52


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    sublime 标题乱码,内容正常
    解决PHP7+ngnix+yaf框架404的问题
    调用RPC接口出现错误:Yar_Client_Transport_Exception (16) curl exec failed 'Timeout was reached'
    xhprof安装和使用
    单点登录
    如何让局域网内Apache互相访问
    lnmp
    virtualbox
    微信省市区 Mysql数据库
    lnmp
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/13546245.html
Copyright © 2020-2023  润新知