• 【笔记】【dp模型】


    【一维偏序】【最长上升/非降子序列】

    两种方法,都是nlogn

    树状数组型

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=100003,M=50003;
    int d[N];//原数组
    int f[M];
    int n,big;
    
    int lowbit(int x)
    { return x&(-x); }
    //用于求上升序列 
    int ask(int x)//返回最后一个 小于等于x 的数的位置 
    {
        int pos=0;
        while(x)
            pos=max(pos,f[x]),x-=lowbit(x);
        return pos;
    }
    void add(int x,int pos)
    {
        while(x<=big)
            f[x]=max(f[x],pos),x+=lowbit(x);
    }
    
    int main()
    {
        while(~scanf("%d",&d[++n])) big=max(big,d[n]);
        n--;
        int ans=1;
        for(int i=n;i;i--)
        {
            int ps=ask(d[i])+1; 
            ans=max(ans,ps);
            add(d[i],ps);//这是非降,就是插入在自己位置
        }//查的时候兄弟也查
        printf("%d
    ",ans);
        
        ans=1;
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        {
            int ps=ask(d[i])+1; 
            ans=max(ans,ps);
            add(d[i]+1,ps);//这是上升
        }//查的时候不查兄弟
        printf("%d
    ",ans);
        return 0;
    } 

    二分型

    #include<cstdio>
    #include<cstdlib> #include<algorithm> using namespace std; const int N=100003,M=50003; int n,f[N],d[N]; int main() { while(~scanf("%d",&d[++n])); n--; int ans=0; for(int i=n;i;i--)//这是非降 { int pos=upper_bound(f+1,f+ans+1,d[i])-f; ans=max(ans,pos); f[pos]=d[i]; } printf("%d ",ans); ans=0,f[1]=0; for(int i=1;i<=n;i++)//这是上升 { int pos=lower_bound(f+1,f+ans+1,d[i])-f; ans=max(ans,pos); f[pos]=d[i]; } printf("%d ",ans); return 0; }
  • 相关阅读:
    Linux 服务器注意事项
    维基逃离MySQL 力挺开源数据库 MariaDB
    服务器性能优化
    1 Nginx + 12 Tomcat +2DB 实现2个程序负载均衡
    服务器虚拟化技术 对比简介
    vSphere虚拟系统 添加虚拟服务器
    IIS停止服务 报错Connections_Refused
    windows服务器 IIS FTP服务
    tomcat solr服务无法搜索中文
    查看php相关信息
  • 原文地址:https://www.cnblogs.com/xwww666666/p/11355669.html
Copyright © 2020-2023  润新知