intmain() { cin >> n; for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
int len = 0; q[0] = -1e9; for (int i = 1; i <= n; i ++ ) { //二分找出q中<a[i]的第一个数 int l = 0, r = len; while (l < r) { int mid = l + r + 1 >> 1; if (q[mid] < a[i]) l = mid; else r = mid - 1; } q[r + 1] = a[i]; len = max(len, r + 1); } cout << len;
//求a的最长上升子序列 int q[N], a[N], n; //q[i]:长度为i的子序列最小的结尾值 int x[N], y[N], mp[N];
intmain() { cin >> n; for (int i = 1; i <= n; i ++ ) { scanf("%d", &x[i]); mp[x[i]] = i; //用于转换y序列 } for (int i = 1; i <= n; i ++ ) { scanf("%d", &y[i]); a[i] = mp[y[i]]; } for (int i = 1; i <= n; i ++ ) cin >> a[i];
int len = 0; q[0] = -1e9; for (int i = 1; i <= n; i ++ ) { //二分找出q中<a[i]的第一个数 int l = 0, r = len; while (l < r) { int mid = l + r + 1 >> 1; if (q[mid] < a[i]) l = mid; else r = mid - 1; } q[r + 1] = a[i]; len = max(len, r + 1); } cout << len;