zoukankan      html  css  js  c++  java
  • hdu 5747 最长上升子序列 (nlogn)

    ac code:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    #define INF 1e9
    #define maxn 100005
    int a[maxn];              //记录原序列
    int d[maxn];              //d[k] 表示长度为k的上升子序列结尾的最小值
    int f[maxn];              //f[t] 表示以a[t]结尾的上升子序列的最大长度
    
    int main()
    {
        int n,m;
        int cas;
        cin >> cas;
        while(cas --){
            cin >> n;
            for(int i = 1;i <= n;i ++){
                cin >> a[i];
            }
            //nlogn 的dp 求最长公共子串
            for(int i = 1;i <= n;i ++){
                d[i] = INF;
                f[i] = 1;
            }
            int nowK = 1;
            for(int i = 1;i <= n;i ++){
                int l,r;
                l = 1;
                r = i+1;
                while(l <= r){
                    int m = (l+r)/2;
                    if(a[i] > d[m]) l = m + 1;
                    else r = m - 1;
                }
                f[i] = l;
                d[l] = a[i];
            }
            for(int i = 1;i <= n-1;i ++)
                printf("%d ",f[i]);
            printf("%d
    ",f[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    快速幂 快速乘法
    扩展欧几里得学习笔记
    求逆序数数目(树状数组+离散化)
    隐式图的遍历
    随机数生成
    推倒重来
    动态规划初步
    子集生成
    东大oj1155 等凹函数
    P1278 单词游戏
  • 原文地址:https://www.cnblogs.com/zhangjialu2015/p/5700344.html
Copyright © 2011-2022 走看看