• P2757 导弹的召唤(数据加强)


    评测
    题目描述同上题。
    其中n<=300000。
    很明显,需要用dp而且要用nlogn复杂度的方法求子序列。

    举例用nlogn的做法求最长上升子序列:
    首先需要一个low[]数组,low[i]表示长度为i的子序列最小的末尾(因为当以两个数为终点的上升子序列,终
    点越小越优),所以,当输入一个数时,如果low[len]< x,直接插入到末尾,否则,在low中找一个比它大或等于它的第一个数,替换。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define LL long long
    #define M 2147483647
    using namespace std;
    int n,a[300005],len;
    int up[300005];//up[i]记的是长度为i的的不上升子序列的最大末位 
    int low[300005];//low[i]记的是长度为i的上升子序列最小末位 
    int search(int l,int r,int z)//在up[]中找一个比z小最大的 
    {
        int mid;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(up[mid]>=z)//up[]递减 
             l=mid+1;
            else r=mid-1;
        }
        return l;
    }
    /*int search2(int l,int r,int z)//在low[]中找一个比z大最小的 
    {
        int mid;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(low[mid]<z)//low[]递增 
             l=mid+1;
            else r=mid-1;
        }
        return l;
    }*///正确的二分!!!
    int main()
    {
        n=1;
        while(scanf("%d",&a[n])!=EOF) n++;
        n--;
        up[++len]=a[1];
        for(int i=2;i<=n;i++)
        {
            if(a[i]<=up[len])
             up[++len]=a[i];
            else 
            {
                up[search(1,len,a[i])]=a[i];
            }
        }
        printf("%d
    ",len);
        len=0;
        low[++len]=a[1];
        for(int i=2;i<=n;i++)
        {
            if(a[i]>low[len])
             low[++len]=a[i];
            else 
            {
                low[lower_bound(low+1,low+len+1,a[i])-low]=a[i];
                //low[search2(1,len,a[i])]=a[i];
            }
        }
        printf("%d",len);
        return 0;   
    }
    

    写一个对的二分好难!

  • 相关阅读:
    并发解决方案
    主外键
    ms
    mq消息丢失
    五种IO模型
    程序运行时间计算gettimeofday&clock_gettime
    exec与xargs区别
    mysql修改数据存放路径(linux)
    od用不同的编码输出文件内容
    segfault at f0 ip 00007f9954108feb sp 00007fffb5e64fc0 error 4 in libxxx.so[7f99540df000+54000]
  • 原文地址:https://www.cnblogs.com/dfsac/p/7587931.html
Copyright © 2020-2023  润新知