Notice
Recent Posts
Recent Comments
Link
반응형
공부혜옹
백준 10868번 최솟값 본문
구간합을 구하는 문제와 비슷한 로직으로 트리에 합이아닌 최솟값을 넣어주고, 업데이트를 할 필요가 없다는 점이 다르다.
자식노드들이 범위에 벗어나느경우와 벗어나지않고 포함되는 경우 혹은 걸쳐 있는 경우등을 따져 최솟값을 구해준다.
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#define INF 987987654321
using namespace std;
typedef long long ll;
ll make_Tree(vector<ll> &a, vector<ll> &tree, int node, int start, int end) {
if (start == end) return 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 + 1, end));
}
ll func(vector<ll> &tree, int node, int start, int end, int left, int right) {
if (start > right || end < left) return INF;
if (left <= start && end <= right) {
return tree[node];
}
int mid = (start + end) >> 1;
return min(func(tree, node << 1, start, mid, left, right)
, func(tree, (node << 1) + 1, mid + 1, end, left, right));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
cin >>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++) {
cin >> a[i];
}
make_Tree(a, tree, 1, 0, n - 1);
while (m--) {
int x, y;
cin >> x >> y;
cout <<func(tree, 1, 0, n - 1, x - 1, y - 1) << '\n';
}
}
반응형
Comments