본문 바로가기

알고리즘/백준

백준 10868 최솟값

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

 

10868번: 최솟값

N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는

www.acmicpc.net

세그먼트 트리를 활용하는 문제다. 문제를 읽다보면 대놓고 세그먼트 트리를 활용하라는 것 같다...

 

 

/* 최솟값 */

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

void solve();
int seg_init(int s, int e, int node);
int seg_find(int s, int e, int l, int r, int node);

int N,M, arr[100000];
vector<int> tree;


int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	solve();

	return 0;
}

int seg_init(int s, int e, int node) {
	if (s == e) 
		return tree[node] = arr[s];

	return (tree[node] = min(seg_init(s, (s + e) / 2, node * 2), seg_init((s + e) / 2 + 1, e, node * 2 + 1)));
}

int seg_find(int s, int e, int l, int r, int node) {
	if (e < l || r < s) return 2100000000; // 각 노드의 최댓값이 10억임
	if (l <= s && e <= r) return tree[node];
	return min(seg_find(s, (s + e) / 2, l, r, node * 2), seg_find((s + e) / 2 + 1, e, l, r, node * 2 + 1));
}

void solve() {
	cin >> N >> M;

	int height = log2(N + 1) + 1;
	tree.resize(1 << (height + 1));

	for (int i = 0; i < N; i++) 
		cin >> arr[i];

	seg_init(0, N - 1, 1);

	for (int i = 0; i < M; i++) {
		int a, b; cin >> a >> b;

		cout << seg_find(0, N - 1, a-1, b-1, 1) << '\n';
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

백준 11437 LCA  (0) 2020.08.18
백준 2493 탑 C++  (0) 2020.08.17
백준 2104 부분배열 고르기  (0) 2020.08.15
백준 2014 소수의 곱  (0) 2020.08.14
백준 10159 저울  (0) 2020.08.14