javaalgorithmdata-structuresdynamic-programminglis

Wavio Sequence - UVa - LIS-nLogn


I am trying to solve uva's question 10534. The question is straight forward i.e

  1. Store LIS at each index i in array L1[].
  2. Reverse the input array nums[].
  3. Store LIS of this reverse array nums[] in L2[]
  4. Reverse L2[].
  5. Now L2[] represents LIS at index i from right instead of left.

I pass the sample test cases but every time I submit I get Runtime error. Can anybody explain why is that? and where do I need to change my code.

class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            String s = br.readLine();
            if(s == null || s.equals("")) break;
            int n = Integer.parseInt(s);
            int[] nums = new int[n];
            String[] str = br.readLine().split(" ");
            for(int i=0; i<n; ++i) nums[i] = Integer.parseInt(str[i]);
            int[] L1 = new int[n];

            /**L1[] represents LIS ending at i**/
            LIS(nums,n,L1);

            /**reverse nums to find LIS*/
            reverse(nums);

            /**L2[] represents LIS on reverse of nums*/
            int[] L2 = new int[n];
            LIS(nums,n,L2);

            /**L2[] represents LIS ending at i starting from right to left*/
            reverse(L2);

            int ans = 0;
            for(int i=0; i<n; ++i){
                ans = Math.max(ans, Math.min(L1[i],L2[i]));
            }
            System.out.println(2*ans-1);
        }

    }
    public static void LIS(int[] nums,int n, int[] L1){
        int[] I = new int[n+1];
        Arrays.fill(I, Integer.MAX_VALUE);
        I[0] = Integer.MIN_VALUE;

        for(int i=0; i<n; ++i){
            int l=0,r=n;

            while(l <= r){
                int mid = l + (r-l)/2;
                if(I[mid] < nums[i])
                    l = mid+1;
                else
                    r = mid-1;
            }
            I[l] = nums[i];
            L1[i] = l;
        }
    }
    public static void reverse(int[] L){
        int l=0;
        int r=L.length-1;
        while(l < r){
            int temp = L[l];
            L[l++] = L[r];
            L[r--] = temp;
        }
    }
}


Solution

  • Not sure is your input method ok for uva solution...

    Try with this:

    public static void main(String[] args) throws IOException{
            Scanner in = new Scanner(System.in);
            while(in.hasNext()){
                int n = in.nextInt();
                int[] nums = new int[n];
                for(int i=0; i<n; ++i) nums[i] = in.nextInt();
                int[] L1 = new int[n];
    
                /**L1[] represents LIS ending at i**/
                LIS(nums,n,L1);
    
                /**reverse nums to find LIS*/
                reverse(nums);
    
                /**L2[] represents LIS on reverse of nums*/
                int[] L2 = new int[n];
                LIS(nums,n,L2);
    
                /**L2[] represents LIS ending at i starting from right to left*/
                reverse(L2);
    
                int ans = 0;
                for(int i=0; i<n; ++i){
                    ans = Math.max(ans, Math.min(L1[i],L2[i]));
                }
                System.out.println(2*ans-1);
            }
    
        }
        public static void LIS(int[] nums,int n, int[] L1){
            int[] I = new int[n+1];
            Arrays.fill(I, Integer.MAX_VALUE);
            I[0] = Integer.MIN_VALUE;
    
            for(int i=0; i<n; ++i){
                int l=0,r=n;
    
                while(l <= r){
                    int mid = l + (r-l)/2;
                    if(I[mid] < nums[i])
                        l = mid+1;
                    else
                        r = mid-1;
                }
                I[l] = nums[i];
                L1[i] = l;
            }
        }
        public static void reverse(int[] L){
            int l=0;
            int r=L.length-1;
            while(l < r){
                int temp = L[l];
                L[l++] = L[r];
                L[r--] = temp;
            }
        }