반응형
문제 출처 :
https://www.acmicpc.net/problem/14428
알고리즘 분석 :
문제 해결에 필요한 사항
1. 세그먼트 트리
최솟값을 찾는 쿼리 문제이다.
이때 최솟값을 찾되 그 최솟값이 존재하는 인덱스를 뽑아야 하기 때문에 pair로 세그먼트 트리를 만든다.
update부분에서 idx가 start와 end사이에 없다면 해당하는 값을 return 시켜 최솟값의 인덱스를 비교시켜 줄 준비를 해준다.
쿼리는 최솟값을 기준으로 쿼리를 하고 마지막 출력은 최솟값이 있는 인덱스를 출력하면 된다.
소스 코드 :
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef pair<int, int> pii; const int INF = 1e9 + 1; pii init(vector<int> &arr, vector<pii> &tree, int node, int start, int end) { if (start == end) return tree[node] = { arr[start], start }; int mid = (start + end) / 2; return tree[node] = min(init(arr, tree, node * 2, start, mid), init(arr, tree, node * 2 + 1, mid + 1, end)); } pii update(vector<pii> &tree, int node, int start, int end, int idx, int val) { if (!(start <= idx && idx <= end)) return tree[node]; if (start == end) return tree[node] = { val, start }; int mid = (start + end) / 2; return tree[node] = min(update(tree, node * 2, start, mid, idx, val), update(tree, node * 2 + 1, mid + 1, end, idx, val)); } pii query(vector<pii> &tree, int node, int start, int end, int left, int right) { if (right < start || left > end) return{ INF, INF }; if (left <= start && end <= right) return tree[node]; int mid = (start + end) / 2; return min(query(tree, node * 2, start, mid, left, right), query(tree, node * 2 + 1, mid + 1, end, left, right)); } int main() { int n; scanf("%d", &n); vector<int> arr(n); for (int i = 0; i < n; i++) scanf("%d", &arr[i]); int h = (int)ceil(log2(n)); int tree_size = (1 << (h + 1)); vector<pii> tree(tree_size); init(arr, tree, 1, 0, n - 1); int m; scanf("%d", &m); while (m--) { int num, i, j; scanf("%d %d %d", &num, &i, &j); if (num == 1) update(tree, 1, 0, n - 1, i - 1, j); else printf("%d\n", query(tree, 1, 0, n - 1, i - 1, j - 1).second + 1); } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1633번] 최고의 팀 만들기 (0) | 2018.04.03 |
---|---|
[1613번] 역사 (0) | 2018.03.28 |
[2422번] 한윤정이 이탈리아에가서 아이스크림을 사먹는데 (0) | 2018.03.23 |
[3067번] Coins (0) | 2018.03.21 |
[9494번] 데구르르 (0) | 2018.03.19 |