반응형
리뷰
세그먼트 트리를 활용하여 최소값을 구하는 문제
문제 풀이
상세 내용은 https://zzzz955.tistory.com/180를 참고 바란다.
위 링크 문제에서 index가 아닌 최소 값을 구하는 문제, 폼은 거의 일치하며 오히려 더 쉬운 문제다.
참고 사항
없음
정답 코드
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<int> tree;
void build(vector<int>& lst, int node, int start, int end) {
if (start == end) {
tree[node] = lst[start];
}
else {
int mid = (start + end) / 2;
build(lst, node * 2, start, mid);
build(lst, node * 2 + 1, mid + 1, end);
tree[node] = min(tree[node * 2], tree[node * 2 + 1]);
}
}
void update(int node, int start, int end, int idx, int val) {
if (start == end) {
tree[node] = val;
}
else {
int mid = (start + end) / 2;
if (start <= idx && idx <= mid) {
update(node * 2, start, mid, idx, val);
}
else {
update(node * 2 + 1, mid + 1, end, idx, val);
}
tree[node] = min(tree[node * 2], tree[node * 2 + 1]);
}
}
int query(int node, int start, int end, int L, int R) {
if (R < start || end < L) {
return 1000000001;
}
if (L <= start && end <= R) {
return tree[node];
}
int mid = (start + end) / 2;
int left = query(node * 2, start, mid, L, R);
int right = query(node * 2 + 1, mid + 1, end, L, R);
return min(left, right);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
vector<int> lst(n);
tree.resize(n * 4);
for (int i = 0; i < n; i++) {
cin >> lst[i];
}
build(lst, 1, 0, n - 1);
cin >> m;
while (m--) {
int a, b, c;
cin >> a >> b >> c;
if (a == 1) update(1, 0, n - 1, b - 1, c);
else cout << query(1, 0, n - 1, b - 1, c - 1) << "\n";
}
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
백준 18436번 수열과 쿼리 37 C++ 세그먼트 트리 (0) | 2024.08.06 |
---|---|
백준 5676번 음주 코딩 C++ 세그먼트 트리 (0) | 2024.08.06 |
백준 14428번 수열과 쿼리 16 C++ 세그먼트 트리 (0) | 2024.08.05 |
백준 1275번 커피숍2 C++ 세그먼트 트리 (0) | 2024.08.05 |
백준 2357번 최솟값과 최댓값 C++ 세그먼트 트리 (0) | 2024.08.05 |