最长上升子序列加强版

. 最长上升子序列加强版

描述

给出N个数,它们各不相同,求最长上升子序列

输入

先给出一个数字N,代表有N组数据
对于每组数据,先给出一个数字TOT,TOT小于等于40000.
接下来有TOT个数字,为1到40000的某个排列.

输出

针对每组数据,输出最长上升序列的长度

样例

输入

复制
4
6
4
2
6
3
1
5
10
2
3
4
5
6
7
8
9
10
1
8
8
7
6
5
4
3
2
1
9
5
8
9
2
3
1
7
4
6

输出

复制
3
9
1
4
#include<bits/stdc++.h>
using namespace std;
const int N=40000+20;
int a[N],ans=1,c[N],h[N];
int lowbit(int x) {
    return x&(-x);
}
void insert(int x,int vol) {
    while(x<=N) {
        c[x]=max(c[x],vol);
        x+=lowbit(x);
    }
}
int ask(int x) {
    int sum=0;
    while(x) {
        sum=max(sum,c[x]);
        x-=lowbit(x);
    }
    return sum;
}
int main() {
    int t;
    cin>>t;
    while(t--) {
        memset(c,0,sizeof(c));
        ans=0;
        int n;
        cin>>n;
        for(int i=1; i<=n; i++)
            cin>>a[i];
        for(int i=1; i<=n; i++) {
             h[i]=ask(a[i])+1;
//            for(int k=1;k<=N;k++)
//            cout<<c[k]<<" ";
//            cout<<endl;
//            cout<<h[i]<<" daan"<<endl;
            insert(a[i]+1,h[i]);
            ans=max(ans,h[i]);
        }

        cout<<ans<<endl;
    }
}

 

posted @ 2020-07-27 09:43  CJXYY  阅读(140)  评论(3编辑  收藏  举报