본문 바로가기
백준

[백준 10868] 최솟값, C++

by 황인태(intaehwang) 2020. 2. 21.
반응형

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

 

10868번: 최솟값

N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는 어려운 문제가 된다. 이 문제를 해결해 보자. 여기서 a번째라는 것은 입력되는 순서로 a번째라는 이야기이다. 예를 들어 a=1, b=3이라면 입력된 순서대로 1번, 2번, 3번 정수 중에서 최솟값을 찾아야 한다. 각각의 정수들은

www.acmicpc.net

본 문제는 구간의 최솟값을 구하는 문제다. 근데 입력이 100,000이다 그래서 O(n^2)으로 풀 수 없다. 입력이 큰데 구간의 최솟값을 구하는 문제는 세그먼트 트리를 이용해여 풀 수 있다. 세그먼트 트리를 이용하여 구간의 최솟값과, 구간의 합을 구할 수 있다.

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
#include <cstdio>
#include <vector>
#include <cmath>
 
using namespace std;
 
int Min(int x, int y) {
    if (x < y) return x;
    else return y;
}
 
void init(vector<int> &tree, vector<int> &a, int node, int start, int end) {
    if (start == end) tree[node] = a[start];
    else {
        init(tree, a, node*2, start, (start+end)/2);
        init(tree, a, node*2+1, (start+end)/2+1end);
        tree[node] = Min(tree[node*2], tree[node*2+1]);
    }
}
 
int query(vector<int> &tree, int node, int start, int endint i, int j) {
    if (i > end || j < start) return -1;
    if (i <= start && j >= endreturn tree[node];
    int m1 = query(tree, node*2, start, (start+end)/2, i, j);
    int m2 = query(tree, node*2+1, (start+end)/2+1end, i, j);
    if (m1 == -1return m2;
    else if (m2 == -1return m1;
    else return Min(m1, m2);
}
 
int main() {
    int n, m;
    scanf("%d %d"&n, &m);
    vector<int> a(n);
    int h = (int)ceil(log2(n));
    int tree_size = (1 << (h+1));
    vector<int> tree(tree_size);
    for (int i = 0; i < n; i++) {
        scanf("%d"&a[i]);
    }
    init(tree, a, 10, n-1);
    for (int i = 0; i < m; i++) {
        int x, y;
        scanf("%d %d"&x, &y);
        printf("%d\n", query(tree, 10, n-1, x-1, y-1));
    }
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 11559] Puyo Puyo, C++  (0) 2020.02.25
[백준 2573] 빙산, C++  (0) 2020.02.25
[백준 11404] 플로이드, C++  (0) 2020.02.21
[백준 1916] 최소비용 구하기, C++  (0) 2020.02.21
[백준 14891] 톱니바퀴, C++  (0) 2020.02.20
Buy me a coffeeBuy me a coffee

댓글