最长上升子序列加强版

描述

给出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
 1 #include<bits/stdc++.h>
 2 #define lowbit(x) x&(-x)
 3 using namespace std;
 4 int n,t,a[400001],sum[400001],f[400001];
 5 void add(int x,int val) {
 6     while(x<=n) {
 7         sum[x]=max(sum[x],val);
 8         x+=lowbit(x);
 9     }
10 }
11 int ask(int x) {
12     int ans=INT_MIN;
13     while(x) {
14         ans=max(sum[x],ans);
15         x-=lowbit(x);
16     }
17     return ans;
18 }
19 int main() {
20     scanf("%d",&t);
21     while(t--) {
22         int ans=INT_MIN;
23         memset(sum,0,sizeof(sum));
24         memset(f,0,sizeof(f));
25         scanf("%d",&n);
26         for(int i=1; i<=n; i++)
27             scanf("%d",&a[i]);
28         for(int i=1; i<=n; i++) {
29             int num=-1;
30             num=max(ask(a[i]),num);
31             f[i]=num+1;
32             add(a[i],f[i]);
33         }
34         for(int i=1; i<=n; i++)
35             ans=max(ans,f[i]);
36         printf("%d\n",ans);
37     }
38     return 0;
39 }

猜你喜欢

转载自www.cnblogs.com/sbwll/p/13383621.html