子集
题目
贪心+二分
很容易将这道题转化为求最长递增子序列。这道题n的范围比较大,O(n^2)的时间复杂度会超时,所以不能使用dp,而应该用贪心+二分。唯一的难点在于xi等于xj该怎么办。
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int T=scanner.nextInt();
for (int k = 0; k < T; k++) {
int n=scanner.nextInt();
int[][] nums=new int[n][2];
for (int j = 0; j < n; j++) {
nums[j][0]=scanner.nextInt();
}
for (int j = 0; j < n; j++) {
nums[j][1]=scanner.nextInt();
}
//当xi=xj时,按y值降序排序,这一步是关键
//因为这样保证了num>d[len]时两个x值必然不相等
Arrays.sort(nums,(a,b)->a[0]==b[0]?b[1]-a[1]:a[0]-b[0]);
int[] d=new int[n+1];
int len=1;
d[len]=nums[0][1];
for(int i=1;i<n;++i){
int num=nums[i][1];
if(num>d[len]){
d[++len]=num;
}else{
int l=0,r=len;
while(l<=r){
int mid=(l+r)/2;
if(d[mid]<num) l=mid+1;
else r=mid-1;
}
d[r+1]=num;
}
}
System.out.println(len);
}
}
}