Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[BOJ] 10868 - 최솟값 본문
728x90
반응형
https://www.acmicpc.net/problem/10868
BOJ - 최솟값
문제 유형: 세그먼트 트리
문제 난이도: Gold I
시간 제한: 1초
메모리 제한: 256MB
문제
N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는 어려운 문제가 된다. 이 문제를 해결해 보자.
여기서 a번째라는 것은 입력되는 순서로 a번째라는 이야기이다. 예를 들어 a=1, b=3이라면 입력된 순서대로 1번, 2번, 3번 정수 중에서 최솟값을 찾아야 한다. 각각의 정수들은 1이상 1,000,000,000이하의 값을 갖는다.
입력
첫째 줄에 N, M이 주어진다. 다음 N개의 줄에는 N개의 정수가 주어진다. 다음 M개의 줄에는 a, b의 쌍이 주어진다.
출력
M개의 줄에 입력받은 순서대로 각 a, b에 대한 답을 출력한다.
풀이
세그먼트 트리의 기본 문제 중 하나.
세그먼트 트리와 지연전파 (Segment Tree, with lazy propagation)
세그먼트 트리References:https://youtu.be/-dUiRtJ8ot0?si=SRjeBHChrzUaN-id 세그먼트 트리란, 1차원 배열에서의 구간 연산에 대해 빠르게 구하는 자료구조이다.구간 [l, r]에 대해서 기존의 naive하게 업데이트
riveroverflow.tistory.com
를 참고.(여기서는 지연전파는 필요없다)
코드
Go
package main
import (
"bufio"
"fmt"
"math"
"os"
)
var (
arr []int32
seg []int32
)
func build(index, l, r int32) {
if l == r {
seg[index] = arr[l]
return
}
mid := (l + r) >> 1
build(index*2, l, mid)
build(index*2+1, mid+1, r)
seg[index] = min(seg[index*2], seg[index*2+1])
}
func query(index, l, r, ql, qr int32) int32 {
if l > qr || r < ql {
return math.MaxInt32
}
if ql <= l && r <= qr {
return seg[index]
}
mid := (l + r) >> 1
return min(query(index*2, l, mid, ql, qr), query(index*2+1, mid+1, r, ql, qr))
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n, m int32
fmt.Fscan(reader, &n, &m)
arr = make([]int32, n+1)
seg = make([]int32, 4*(n+1))
for i := int32(1); i <= n; i++ {
fmt.Fscan(reader, &arr[i])
}
build(1, 1, n)
for i := int32(0); i < m; i++ {
var a, b int32
fmt.Fscan(reader, &a, &b)
fmt.Fprintln(writer, query(1, 1, n, a, b))
}
}
728x90
반응형
'PS > BOJ' 카테고리의 다른 글
[BOJ] 5052 - Phone List (0) | 2025.02.27 |
---|---|
[BOJ] 3353 - Printed Circuit Board (0) | 2025.02.25 |
[BOJ] 1520 - 내리막 길 (0) | 2025.02.24 |
[BOJ] 1389 - 케빈 베이컨의 6단계 법칙 (0) | 2025.02.24 |
[BOJ] 28703 - Double It (0) | 2025.02.24 |