From 80e25791fddbad0305279986718644daf284b803 Mon Sep 17 00:00:00 2001 From: HeeEul Shin <83682424+ShinHeeEul@users.noreply.github.com> Date: Tue, 25 Feb 2025 20:57:19 +0900 Subject: [PATCH] =?UTF-8?q?[20250203]=20BOJ=20/=20P5=20/=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=EB=B0=B0=EC=97=B4=20=EA=B3=A0=EB=A5=B4=EA=B8=B0=20/?= =?UTF-8?q?=20=EC=8B=A0=ED=9D=AC=EC=9D=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4 \352\263\240\353\245\264\352\270\260.md" | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 "ShinHeeEul/202502/25 BOJ P5 \353\266\200\353\266\204\353\260\260\354\227\264 \352\263\240\353\245\264\352\270\260.md" diff --git "a/ShinHeeEul/202502/25 BOJ P5 \353\266\200\353\266\204\353\260\260\354\227\264 \352\263\240\353\245\264\352\270\260.md" "b/ShinHeeEul/202502/25 BOJ P5 \353\266\200\353\266\204\353\260\260\354\227\264 \352\263\240\353\245\264\352\270\260.md" new file mode 100644 index 00000000..309de1b7 --- /dev/null +++ "b/ShinHeeEul/202502/25 BOJ P5 \353\266\200\353\266\204\353\260\260\354\227\264 \352\263\240\353\245\264\352\270\260.md" @@ -0,0 +1,109 @@ +```java +import java.util.Arrays; + +public class Main { + + static long[] sums; + static Node[] segments; + static int size; + static int N; + static long max; + + static Node MAX_NODE = new Node(-1, Integer.MAX_VALUE); + + public static void main(String[] args) throws Exception { + + N = read(); + size = 1; + sums = new long[N + 1]; + + while(size < N) { + size <<= 1; + } + + segments = new Node[(size << 1) + 1]; + Arrays.fill(segments, MAX_NODE); + for(int i = size + 1; i < size + N + 1; i++) { + int a = read(); + int b = i - size; + sums[b] = a + sums[b - 1]; + segments[i] = new Node(b, a); + } + + int segmentSize = (size << 1); + + while(segmentSize > 1) { + Node a = segments[segmentSize - 1]; + Node b = segments[segmentSize]; + int c = segmentSize >> 1; + if(a.min < b.min) { + segments[c] = a; + } else { + segments[c] = b; + } + segmentSize -= 2; + } + + backTracking(1, N); + System.out.println(max); + } + + public static void backTracking(int start, int end) { + if(start > end || start <= 0 || start > N || end > N) return; + Node node = query(start, end, 2, 1, size); + + max = Math.max(max, node.min * (sums[end] - sums[start - 1])); + + if(end == start) return; + int index = node.index; + backTracking(start, index - 1); + backTracking(index + 1, end); + } + + public static Node query(int left, int right, int node, int start, int end) { + if(end < left || right < start) return MAX_NODE; + + if(left <= start && end <= right) { + return segments[node]; + } + + int mid = (start + end) >> 1; + int halfNode = (node << 1); + Node a = query(left, right, halfNode - 1, start, mid); + Node b = query(left, right, halfNode, mid + 1, end); + + if(a.min < b.min) { + return a; + } + return b; + } + + public static class Node { + int index; + int min; + + Node(int index, int min) { + this.index = index; + this.min = min; + } + } + + private static int read() throws Exception { + int d, o; + boolean negative = false; + d = System.in.read(); + + if (d == '-') { + negative = true; + d = System.in.read(); + } + o = d & 15; + + while ((d = System.in.read()) > 32) + o = (o << 3) + (o << 1) + (d & 15); + + return negative? -o:o; + } + +} +```