반응형
세그먼트 트리의 기본 예제문제였습니다.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <vector> using namespace std; int n, m; void init(vector <int> &tree, vector <int>&a, int node, int start, int end)//트리에 시작점을 넣어 초기화해주는 함수 { if(start==end) tree[node] = a[start]; else { init(tree, a, node * 2, start, (start + end) / 2); init(tree, a, node * 2 + 1, (start + end) / 2 + 1, end); tree[node] = min(tree[node * 2], tree[node * 2 + 1]); } } int query(vector <int>&tree, int node, int start, int end, int i, int j) { if (i > end || j < start) { return -1; }//시작점과 끝점의 범위를 넘어간다면 -1리턴 if (i <= start && end <= j) { return tree[node]; }//범위 안이라면 노드의 값을 리턴 int m1 = query(tree, node * 2, start, (start + end) / 2, i, j); int m2 = query(tree, node * 2 + 1, (start + end) / 2 + 1,end, i, j); if (m1 == -1) { return m2; } else if (m2 == -1) { return m1; } else { return min(m1, m2); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; vector <int> a(n); int h = ceil(log2(n)); int tree_size = (1 << (h + 1)); vector <int> tree(tree_size); for (int i = 0; i < n; i++) cin >> a[i]; init(tree, a, 1,0,n-1); while (m--) { int start, end; cin >> start >> end; cout << query(tree, 1, 0, n - 1, start - 1, end - 1) << '\n'; } } | cs |
'Algorithm' 카테고리의 다른 글
(C++) - 백준(BOJ) 2775번 : 부녀회장이 될테야 답 (0) | 2017.02.25 |
---|---|
(C++) - 백준(BOJ) 6086번 : 최대 유량 답 (0) | 2017.02.24 |
(C++) - 백준(BOJ) 1761번 : 정점들의 거리 답 (0) | 2017.02.24 |
(C++) - 백준(BOJ) 11437번 : 가장 가까운 공통 조상 찾기 답 (0) | 2017.02.24 |
(C++) - 백준(BOJ) 2740번 : 행렬 곱셈 답 (0) | 2017.02.19 |