[伯俊10816]デジタルカード2-JAVA



問題のソース


https://www.acmicpc.net/problem/10816

に答える

  • これは二分探索によって解決できる問題であるが、これは初めて見たことである.
  • Key値の最小開始インデックスと最大終了インデックスは、上界と下界で解くことができる.
  • https://st-lab.tistory.com/267のプールを解析しました.
  • コード#コード#

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            int N = Integer.parseInt(stringTokenizer.nextToken());
            int[] arr = new int[N];
            stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            for (int i = 0; i < N; i++) {
                arr[i] = Integer.valueOf(stringTokenizer.nextToken());
            }
            Arrays.sort(arr);
    
            stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            int M = Integer.parseInt(stringTokenizer.nextToken());
            stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < M; i++) {
                int key = Integer.parseInt(stringTokenizer.nextToken());
                stringBuilder.append(upperBound(arr, key) - lowerBound(arr, key)).append(" ");
            }
            System.out.println(stringBuilder);
        }
    
        public static int lowerBound(int[] arr, int key) {
            int lo = 0;
            int hi = arr.length;
    
            while (lo < hi) {
                int mid = (lo + hi) / 2;
                if (key <= arr[mid]) {
                    hi = mid;
                } else {
                    lo = mid + 1;
                }
            }
    
            return lo;
        }
    
        public static int upperBound(int[] arr, int key) {
            int lo = 0;
            int hi = arr.length;
    
            while (lo < hi) {
                int mid = (lo + hi) / 2;
                if (key < arr[mid]) {
                    hi = mid;
                } else {
                    lo = mid + 1;
                }
            }
    
            return lo;
        }
    }

    採点結果