#include<iostream> #include<vector> using namespace std; int biSearch(int x, vector<int>& dp) { //二分查找函数 int left = 0, right = dp.size(), mid; while (left <= right) { mid = (right + left) / 2; if (dp[mid] >= x) right = mid - 1; else left = mid + 1; } return left; } int lis(vector<int>& arr) { vector<int> dp;//用于二分划分的辅助数组 dp.push_back(arr[0]); for (int i = 1; i < arr.size(); i++) { if (arr[i] > dp[dp.size() - 1]) { dp.push_back(arr[i]); } else { int t = biSearch(arr[i], dp); //二分查找,找到第一个大于arr[i]的dp位置 dp[t] = arr[i]; } } return dp.size(); } int main() { int n; while (cin >> n) { vector<int> arr(n); for (int i = 0; i < n; i++) //输入 cin >> arr[i]; cout << lis(arr) << endl; //计算最长递增子序列长度 } return 0; }