. 最长上升子序列加强版
描述
给出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; } }