子集

题目

贪心+二分

很容易将这道题转化为求最长递增子序列。这道题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);
        }
    }
}
posted @ 2022-03-02 21:50  归鸿唱晚  阅读(212)  评论(0编辑  收藏  举报