BOJ::10868 최소값

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

세그먼트 트리를 이용하는 2042번 구간합 구하기 와 비슷한 문제이나 더 쉬운 문제이다.

업데이트를 할 필요가 없기 때문이다.


2042번 문제와 10868번을 풀 수 있으면 세그먼트 트리에 대해서 어느정도 감을 잡을 수 있는것 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <vector>
#include <cmath>
#define INF 987987654321
using namespace std;
typedef long long ll;
 
ll min(ll a, ll b) {
    return (a < b) ? a : b;
}
 
ll make_Tree(vector<ll> &a, vector<ll> &tree, int node, int start, int end) {
    //리프 노드인 경우 
    if (start == endreturn tree[node] = a[start];
    int mid = (start + end>> 1;
    //리프 노드가 아닌 경우 자식중 최소값으로 저장
    return tree[node] = min(
          make_Tree(a, tree, node << 1, start, mid)
         ,make_Tree(a, tree, (node << 1+ 1, mid + 1end));
}
 
//최소값 구하기
ll getMin(vector<ll> &tree, int node, int start, int endint left, int right) {
    //범위에 벗어나는 경우 INF 리턴
    if (start > right || end < left) return INF;
    //범위에 완전히 포함되는경우 현재 node값 리턴
    if (left <= start && end <= right) {
        return tree[node];
    }
    // 리프노드, 범위에 완전히 포함되는 경우가 아닌경우
    // 자식노드로 호출하고 결과 값 리턴
    int mid = (start + end>> 1;
    return min(getMin(tree, node << 1, start, mid, left, right)
        , getMin(tree, (node << 1+ 1, mid + 1end, left, right));
}
 
int main() {
    int n, m;
    scanf("%d %d"&n, &m);
 
    int h = (int)ceil(log2(n));
 
    vector<ll> a(n);
    vector<ll> tree(1 << h + 1);
 
    for (int i = 0; i < n; i++) {
        scanf("%lld"&a[i]);
    }
 
    make_Tree(a, tree, 10, n - 1);
 
    while (m--) {
        int x, y;
        scanf("%d %d"&x, &y);
        printf("%lld\n", getMin(tree, 10, n - 1, x - 1, y - 1));
    }
}
cs


'BOJ::문제풀이' 카테고리의 다른 글

1976 여행가자  (0) 2018.02.12
11505 구간 곱 구하기  (0) 2018.02.11
1717 집합의 표현  (0) 2018.02.11
1197 최소 스패닝 트리  (0) 2018.02.11
2042 구간 합 구하기  (0) 2018.02.09

+ Recent posts