一:
1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 #define MAXN 50000 4 #define ia (i+1)%2 5 #define ib i%2 6 typedef long long ll; 7 using namespace std; 8 int dp[MAXN],a[MAXN]; 9 int ans; 10 int LIS(int *a,int n) 11 { 12 int k=0; 13 dp[0]=a[0]; 14 for(int i=1;i<n;i++) 15 { 16 if(a[i]>dp[k]) 17 dp[++k]=a[i]; 18 else 19 { 20 int x=lower_bound(dp,dp+k+1,a[i])-dp; 21 dp[x]=a[i]; 22 } 23 } 24 return k+1; 25 } 26 int main() 27 { 28 ios::sync_with_stdio(false); 29 int n; 30 cin>>n; 31 for(int i=0;i<n;i++) 32 cin>>a[i]; 33 cout<<LIS(a,n)<<endl; 34 35 return 0; 36 }
二(可求得每个长度的LIS,但要两次二分)
1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 #define MAXN 50000 4 typedef long long ll; 5 using namespace std; 6 int dp[MAXN],a[MAXN],len[MAXN]; 7 int ans; 8 int LIS(int *a,int n) 9 { 10 int k=0; 11 memset(dp,INF,sizeof(dp)); 12 dp[0]=a[0]; 13 for(int i=1;i<n;i++) 14 { 15 *lower_bound(dp,dp+n,a[i])=a[i]; 16 len[i]=lower_bound(dp,dp+n,INF)-dp; 17 } 18 } 19 int main() 20 { 21 ios::sync_with_stdio(false); 22 int n; 23 cin>>n; 24 for(int i=0;i<n;i++) 25 cin>>a[i]; 26 LIS(a,n); 27 cout<<len[n-1]<<endl; 28 return 0; 29 }