直线 L1 如果和 L2 不相交,那么L1的左右端点要么都小于L2,要么L1的左右端点都大于L2。
因为题目给的数组已经保证了左端点递增,所以我们只需要求这个数组的最长上升子序列就行了。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX_N 50005
using namespace std;
typedef long long int ll;
int main()
{
//freopen("1.txt", "r", stdin);
int T, a[MAX_N];
cin >> T;
while (T--)
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
///LIS的O(nlogn)算法
int len[MAX_N], k = 0;
for (int i = 0; i < n; i++)
{
int Index = lower_bound(len, len + k, a[i]) - len;
if (Index == k)
len[k++] = a[i];
else
len[Index] = a[i];
}
printf("%d\n", k);
}
return 0;
}