[적용한 알고리즘]
세그먼트 트리
[아이디어]
내용
[생각의 흐름 / 절차]
내용
[교훈]
세그먼트 트리에서 update 함수가 빠진 모양
그냥 응용이었다.
<코드>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
long long construct(vector<long long> &a, vector<long long> &tree, int node, int start, int end){
if (start == end){
return tree[node] = a[start];
}
else {
int mid = (start + end) / 2;
return tree[node] = min(construct(a, tree, node * 2, start, mid), construct(a, tree, node * 2 + 1, mid + 1, end));
}
}
//left : 구하고 싶은 범위의 시작, right : 구하고 싶은 범위의 끝
long long SegmentTree(vector<long long> &tree, int node, int start, int end, int left, int right){
if (left > end || right < start){
return 1000000001;
} // 범위를 벗어날 때
if (left <= start && end <= right){
return tree[node];
}
int mid = (start + end) / 2;
return min(SegmentTree(tree, node * 2, start, mid, left, right), SegmentTree(tree, node * 2 + 1, mid + 1, end, left, right));
}
int main(){
int n, m;
scanf("%d %d", &n, &m);
vector<long long> a(n);
int h = (int) ceil(log2(n));
int tree_size = (1 << (h + 1));
vector<long long> tree(tree_size);
for (int i = 0; i < n; i++){
scanf("%lld", &a[i]);
}
construct(a, tree, 1, 0, n - 1);
while (m--){
int x, y;
scanf("%d %d", &x, &y);
printf("%lld\n", SegmentTree(tree, 1, 0, n - 1, x - 1, y - 1));
}
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 11650번 좌표 정렬하기 (0) | 2019.11.23 |
---|---|
[백준] 2357번 최솟값과 최댓값 (0) | 2019.11.23 |
[백준] 2042번 구간 합 구하기 (0) | 2019.11.23 |
[백준] 16933번 벽 부수고 이동하기 3 (0) | 2019.11.20 |
[백준] 14442번 벽 부수고 이동하기 2 (0) | 2019.11.20 |