From d10da6a774e14dc1ea58ea2cd3f56a1aa02f0fce Mon Sep 17 00:00:00 2001 From: HeeEul Shin <83682424+ShinHeeEul@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:43:27 +0900 Subject: [PATCH] =?UTF-8?q?[20250407]=20BOJ=20/=20P3=20/=20=EC=88=98?= =?UTF-8?q?=EC=97=B4=EA=B3=BC=20=EC=BF=BC=EB=A6=AC=201=20/=20=EC=8B=A0?= =?UTF-8?q?=ED=9D=AC=EC=9D=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\352\263\274 \354\277\274\353\246\2541.md" | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 "ShinHeeEul/202504/07 BOJ P3 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\2541.md" diff --git "a/ShinHeeEul/202504/07 BOJ P3 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\2541.md" "b/ShinHeeEul/202504/07 BOJ P3 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\2541.md" new file mode 100644 index 00000000..50519ea6 --- /dev/null +++ "b/ShinHeeEul/202504/07 BOJ P3 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\2541.md" @@ -0,0 +1,128 @@ +```java + +import java.util.*; +import java.io.*; + +class Main { + + static Node[] segments; + static int N; + static int size = 1; + public static void main(String args[]) throws Exception { + N = read(); + StringBuilder sb = new StringBuilder(); + while(size < N) size <<= 1; + + segments = new Node[(size << 1) + 1]; + + // 머지 소트 트리 구성하고 + for(int i = size + 1 ; i < size + N + 1; i++) { + segments[i] = new Node(); + segments[i].arr = new int[1]; + segments[i].arr[0] = read(); + } + + for(int i = size + N + 1 ; i < (size << 1) + 1; i++) { + segments[i] = new Node(); + segments[i].arr = new int[1]; + segments[i].arr[0] = 0; + } + int segmentSize = size << 1; + + + while(segmentSize > 2) { + merge(segments[segmentSize], segments[segmentSize - 1], + segmentSize >> 1, segments[segmentSize].arr.length << 1); + segmentSize -= 2; + } + // 해당 범위 내에 포함될 때 이분 탐색으로 값 탐색하기 + int M = read(); + + while(M --> 0) { + sb.append(query(read(),read(),2,1, size, read())).append("\n"); + } + + System.out.println(sb); + } + + public static void merge(Node left, Node right, int idx, int mergeSize) { + segments[idx] = new Node(); + segments[idx].arr = new int[mergeSize]; + + // 좌측 인덱스, 우측 인덱스 + int leftIdx = 0; + int rightIdx = 0; + int end = (mergeSize >> 1); + // 더 작은 값을 업데이트 하고 다음 인덱스로 옮기기 + for(int i = 0; i < mergeSize; i++) { + //System.out.println(leftIdx + " " + rightIdx); + if(rightIdx == end) { + segments[idx].arr[i] = left.arr[leftIdx]; + leftIdx++; + continue; + } + + if(leftIdx == end){ + segments[idx].arr[i] = right.arr[rightIdx]; + rightIdx++; + continue; + } + int a = left.arr[leftIdx]; + int b = right.arr[rightIdx]; + if(a < b) { + segments[idx].arr[i] = a; + leftIdx++; + continue; + } else { + segments[idx].arr[i] = b; + rightIdx++; + continue; + } + } + } + + public static int query(int left, int right, int node, int start, int end, int k) { + + if(end < left || right < start) return 0; + + if(left <= start && end <= right) { + // 이분 탐색 + Node n = segments[node]; + int l = 0; + int r = n.arr.length; + + while(l < r) { + int mid = (l + r) >> 1; + if(n.arr[mid] > k) { + r = mid; + } else { + l = mid + 1; + } + } + return n.arr.length - l; + } + + int mid = (start + end) >> 1; + return query(left, right, (node << 1) - 1, start, mid, k) + query(left, right, node << 1, mid + 1, end, k); + + } + + public static class Node { + int[] arr; + } + + private static int read() throws Exception { + int d, o; + d = System.in.read(); + + o = d & 15; + + while ((d = System.in.read()) > 32) + o = (o << 3) + (o << 1) + (d & 15); + + return o; + } + + +} +```