From 8cbb7f0a1eb84ae714d729be85058a5762411f0d Mon Sep 17 00:00:00 2001 From: beberiche Date: Tue, 9 Apr 2024 07:58:10 +0900 Subject: [PATCH 1/3] [ADD] baekjoon 18436 java solution --- solutions/baekjoon/18436/Main.java | 144 +++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 solutions/baekjoon/18436/Main.java diff --git a/solutions/baekjoon/18436/Main.java b/solutions/baekjoon/18436/Main.java new file mode 100644 index 0000000..563963c --- /dev/null +++ b/solutions/baekjoon/18436/Main.java @@ -0,0 +1,144 @@ +// Authored by: beberiche +// Co-authored by: - +// Link: http://boj.kr/a194b1386c8a4767aac779c171d0d2f1 + +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) { + FastReader rd = new FastReader(); + int N = rd.nextInt(); + int[] a = new int[N + 1]; + for (int i = 1; i <= N; i++) { + a[i] = rd.nextInt(); + } + int h = (int) Math.ceil(Math.log(N) / Math.log(2)); + int size = 1 << (h + 1); + int[] tree_odd = new int[size]; + int[] tree_even = new int[size]; + + init(1, 1, N, a, tree_odd, tree_even); + + int M = rd.nextInt(); + + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < M; i++) { + int cmd = rd.nextInt(); + int n1 = rd.nextInt(); + int n2 = rd.nextInt(); + + if (cmd == 1) { + update(1, 1, N, n1, n2, tree_odd, tree_even); + } else if (cmd == 2) { + sb.append(query(1, 1, N, n1, n2, tree_odd, tree_even, true)).append("\n"); + } else { + sb.append(query(1, 1, N, n1, n2, tree_odd, tree_even, false)).append("\n"); + } + } + System.out.print(sb.toString()); + } + + + private static void init(int curr, int st, int ed, int[] a, int[] tree_odd, int[] tree_even) { + if (st == ed) { + if (a[st] % 2 == 1) { + tree_odd[curr] = 1; + } else { + tree_even[curr] = 1; + } + return; + } + + int mid = (st + ed) / 2; + init(curr * 2, st, mid, a, tree_odd, tree_even); + init(curr * 2 + 1, mid + 1, ed, a, tree_odd, tree_even); + tree_odd[curr] = tree_odd[curr * 2] + tree_odd[curr * 2 + 1]; + tree_even[curr] = tree_even[curr * 2] + tree_even[curr * 2 + 1]; + } + + private static void update(int curr, int st, int ed, int idx, int newVal, int[] tree_odd, int[] tree_even) { + if (idx < st || ed < idx) { + return; + } + + if (st == ed) { + tree_even[curr] = newVal % 2 == 0 ? 1 : 0; + tree_odd[curr] = newVal % 2 == 1 ? 1 : 0; + return; + } + + int mid = (st + ed) / 2; + update(curr * 2, st, mid, idx, newVal, tree_odd, tree_even); + update(curr * 2 + 1, mid + 1, ed, idx, newVal, tree_odd, tree_even); + tree_odd[curr] = tree_odd[curr * 2] + tree_odd[curr * 2 + 1]; + tree_even[curr] = tree_even[curr * 2] + tree_even[curr * 2 + 1]; + } + + private static int query(int curr, int st, int ed, int l, int r, int[] tree_odd, int[] tree_even, boolean check) { + if (r < st || ed < l) { + return 0; + } + + + if (l <= st && ed <= r) { + if (check) return tree_even[curr]; + else return tree_odd[curr]; + } + + + int mid = (st + ed) / 2; + int ret1 = query(curr * 2, st, mid, l, r, tree_odd, tree_even, check); + int ret2 = query(curr * 2 + 1, mid + 1, ed, l, r, tree_odd, tree_even, check); + return ret1 + ret2; + } + + static class FastReader { + BufferedReader br; + StringTokenizer st; + + public FastReader() { + br = new BufferedReader(new InputStreamReader(System.in)); + } + + String next() { + while (st == null || !st.hasMoreElements()) { + try { + st = new StringTokenizer(br.readLine()); + } catch (IOException e) { + e.printStackTrace(); + } + } + return st.nextToken(); + } + + int nextInt() { + return Integer.parseInt(next()); + } + + long nextLong() { + return Long.parseLong(next()); + } + + double nextDouble() { + return Double.parseDouble(next()); + } + + String nextLine() { + String str = ""; + try { + str = br.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + return str; + } + } +} + +/* Solution Description + + 1. 세그먼트 트리 기본 문제. `tree[]` 를 2개 만들어, 임의의 범위에 대한 짝수, 홀수인 경우의 갯수를 따로 구한다. + + */ + From c06de67bef075a07cac1af0e97c28c1ee9bc72ed Mon Sep 17 00:00:00 2001 From: beberiche Date: Tue, 9 Apr 2024 08:00:45 +0900 Subject: [PATCH 2/3] solution description update --- solutions/baekjoon/18436/Main.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/solutions/baekjoon/18436/Main.java b/solutions/baekjoon/18436/Main.java index 563963c..69d7b9b 100644 --- a/solutions/baekjoon/18436/Main.java +++ b/solutions/baekjoon/18436/Main.java @@ -138,7 +138,8 @@ String nextLine() { /* Solution Description - 1. 세그먼트 트리 기본 문제. `tree[]` 를 2개 만들어, 임의의 범위에 대한 짝수, 홀수인 경우의 갯수를 따로 구한다. + 1. 세그먼트 트리 기본 문제. `tree[]` 를 2개 만들어, + 임의의 범위에 대한 짝수, 홀수인 경우의 갯수를 따로 구한다. */ From bdd7903d6430c76991d75348d0c2be57b54518e5 Mon Sep 17 00:00:00 2001 From: Minsang Kim Date: Wed, 29 Jan 2025 16:35:59 +0900 Subject: [PATCH 3/3] Refactoring --- solutions/baekjoon/18436/Main.java | 259 ++++++++++++++--------------- 1 file changed, 129 insertions(+), 130 deletions(-) diff --git a/solutions/baekjoon/18436/Main.java b/solutions/baekjoon/18436/Main.java index 69d7b9b..939ecbc 100644 --- a/solutions/baekjoon/18436/Main.java +++ b/solutions/baekjoon/18436/Main.java @@ -6,140 +6,139 @@ import java.io.*; public class Main { - public static void main(String[] args) { - FastReader rd = new FastReader(); - int N = rd.nextInt(); - int[] a = new int[N + 1]; - for (int i = 1; i <= N; i++) { - a[i] = rd.nextInt(); - } - int h = (int) Math.ceil(Math.log(N) / Math.log(2)); - int size = 1 << (h + 1); - int[] tree_odd = new int[size]; - int[] tree_even = new int[size]; - - init(1, 1, N, a, tree_odd, tree_even); - - int M = rd.nextInt(); - - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < M; i++) { - int cmd = rd.nextInt(); - int n1 = rd.nextInt(); - int n2 = rd.nextInt(); - - if (cmd == 1) { - update(1, 1, N, n1, n2, tree_odd, tree_even); - } else if (cmd == 2) { - sb.append(query(1, 1, N, n1, n2, tree_odd, tree_even, true)).append("\n"); - } else { - sb.append(query(1, 1, N, n1, n2, tree_odd, tree_even, false)).append("\n"); - } - } - System.out.print(sb.toString()); - } - - - private static void init(int curr, int st, int ed, int[] a, int[] tree_odd, int[] tree_even) { - if (st == ed) { - if (a[st] % 2 == 1) { - tree_odd[curr] = 1; - } else { - tree_even[curr] = 1; - } - return; - } - - int mid = (st + ed) / 2; - init(curr * 2, st, mid, a, tree_odd, tree_even); - init(curr * 2 + 1, mid + 1, ed, a, tree_odd, tree_even); - tree_odd[curr] = tree_odd[curr * 2] + tree_odd[curr * 2 + 1]; - tree_even[curr] = tree_even[curr * 2] + tree_even[curr * 2 + 1]; - } - - private static void update(int curr, int st, int ed, int idx, int newVal, int[] tree_odd, int[] tree_even) { - if (idx < st || ed < idx) { - return; - } - - if (st == ed) { - tree_even[curr] = newVal % 2 == 0 ? 1 : 0; - tree_odd[curr] = newVal % 2 == 1 ? 1 : 0; - return; - } - - int mid = (st + ed) / 2; - update(curr * 2, st, mid, idx, newVal, tree_odd, tree_even); - update(curr * 2 + 1, mid + 1, ed, idx, newVal, tree_odd, tree_even); - tree_odd[curr] = tree_odd[curr * 2] + tree_odd[curr * 2 + 1]; - tree_even[curr] = tree_even[curr * 2] + tree_even[curr * 2 + 1]; - } - - private static int query(int curr, int st, int ed, int l, int r, int[] tree_odd, int[] tree_even, boolean check) { - if (r < st || ed < l) { - return 0; - } - - - if (l <= st && ed <= r) { - if (check) return tree_even[curr]; - else return tree_odd[curr]; - } - - - int mid = (st + ed) / 2; - int ret1 = query(curr * 2, st, mid, l, r, tree_odd, tree_even, check); - int ret2 = query(curr * 2 + 1, mid + 1, ed, l, r, tree_odd, tree_even, check); - return ret1 + ret2; - } - - static class FastReader { - BufferedReader br; - StringTokenizer st; - - public FastReader() { - br = new BufferedReader(new InputStreamReader(System.in)); - } - - String next() { - while (st == null || !st.hasMoreElements()) { - try { - st = new StringTokenizer(br.readLine()); - } catch (IOException e) { - e.printStackTrace(); - } - } - return st.nextToken(); - } - - int nextInt() { - return Integer.parseInt(next()); - } - - long nextLong() { - return Long.parseLong(next()); - } - - double nextDouble() { - return Double.parseDouble(next()); - } - - String nextLine() { - String str = ""; - try { - str = br.readLine(); - } catch (IOException e) { - e.printStackTrace(); - } - return str; - } - } + public static void main(String[] args) { + FastReader rd = new FastReader(); + int N = rd.nextInt(); + int[] a = new int[N + 1]; + for (int i = 1; i <= N; i++) { + a[i] = rd.nextInt(); + } + int h = (int) Math.ceil(Math.log(N) / Math.log(2)); + int size = 1 << (h + 1); + int[] tree_odd = new int[size]; + int[] tree_even = new int[size]; + + init(1, 1, N, a, tree_odd, tree_even); + + int M = rd.nextInt(); + + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < M; i++) { + int cmd = rd.nextInt(); + int n1 = rd.nextInt(); + int n2 = rd.nextInt(); + + if (cmd == 1) { + update(1, 1, N, n1, n2, tree_odd, tree_even); + } else if (cmd == 2) { + sb.append(query(1, 1, N, n1, n2, tree_odd, tree_even, true)).append("\n"); + } else { + sb.append(query(1, 1, N, n1, n2, tree_odd, tree_even, false)).append("\n"); + } + } + System.out.print(sb.toString()); + } + + + private static void init(int curr, int st, int ed, int[] a, int[] tree_odd, int[] tree_even) { + if (st == ed) { + if (a[st] % 2 == 1) { + tree_odd[curr] = 1; + } else { + tree_even[curr] = 1; + } + return; + } + + int mid = (st + ed) / 2; + init(curr * 2, st, mid, a, tree_odd, tree_even); + init(curr * 2 + 1, mid + 1, ed, a, tree_odd, tree_even); + tree_odd[curr] = tree_odd[curr * 2] + tree_odd[curr * 2 + 1]; + tree_even[curr] = tree_even[curr * 2] + tree_even[curr * 2 + 1]; + } + + private static void update(int curr, int st, int ed, int idx, int newVal, int[] tree_odd, int[] tree_even) { + if (idx < st || ed < idx) { + return; + } + + if (st == ed) { + tree_even[curr] = newVal % 2 == 0 ? 1 : 0; + tree_odd[curr] = newVal % 2 == 1 ? 1 : 0; + return; + } + + int mid = (st + ed) / 2; + update(curr * 2, st, mid, idx, newVal, tree_odd, tree_even); + update(curr * 2 + 1, mid + 1, ed, idx, newVal, tree_odd, tree_even); + tree_odd[curr] = tree_odd[curr * 2] + tree_odd[curr * 2 + 1]; + tree_even[curr] = tree_even[curr * 2] + tree_even[curr * 2 + 1]; + } + + private static int query(int curr, int st, int ed, int l, int r, int[] tree_odd, int[] tree_even, boolean check) { + if (r < st || ed < l) { + return 0; + } + + + if (l <= st && ed <= r) { + if (check) return tree_even[curr]; + else return tree_odd[curr]; + } + + + int mid = (st + ed) / 2; + int ret1 = query(curr * 2, st, mid, l, r, tree_odd, tree_even, check); + int ret2 = query(curr * 2 + 1, mid + 1, ed, l, r, tree_odd, tree_even, check); + return ret1 + ret2; + } + + static class FastReader { + BufferedReader br; + StringTokenizer st; + + public FastReader() { + br = new BufferedReader(new InputStreamReader(System.in)); + } + + String next() { + while (st == null || !st.hasMoreElements()) { + try { + st = new StringTokenizer(br.readLine()); + } catch (IOException e) { + e.printStackTrace(); + } + } + return st.nextToken(); + } + + int nextInt() { + return Integer.parseInt(next()); + } + + long nextLong() { + return Long.parseLong(next()); + } + + double nextDouble() { + return Double.parseDouble(next()); + } + + String nextLine() { + String str = ""; + try { + str = br.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + return str; + } + } } /* Solution Description - 1. 세그먼트 트리 기본 문제. `tree[]` 를 2개 만들어, + 1. 세그먼트 트리 기본 문제. `tree[]` 를 2개 만들어, 임의의 범위에 대한 짝수, 홀수인 경우의 갯수를 따로 구한다. */ -