공부혜옹

백준 10868번 최솟값 본문

카테고리 없음

백준 10868번 최솟값

Blair06 2021. 5. 4. 22:40

구간합을 구하는 문제와 비슷한 로직으로 트리에 합이아닌 최솟값을 넣어주고, 업데이트를 할 필요가 없다는 점이 다르다.
자식노드들이 범위에 벗어나느경우와 벗어나지않고 포함되는 경우 혹은 걸쳐 있는 경우등을 따져 최솟값을 구해준다.

#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