구간별 특정값들을 빠르게 계산하는 문제에서 필요함.
구간의 최대값, 커서가 움직이는 상태에서 가까운 위치 구하기 (cd홀더, 앱관리, 공사차량 등)
구간트리 생성, 업데이트, 쿼리 하는 코드
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 | #include <stdio.h> const int N = 50; int tree[N * 4], A[N]; inline int Max(int a, int b) { return a > b ? a : b; } void build(int now, int s, int e) { if (s == e) { tree[now] = s; // 배열값을 넣어야 한다면 A[s] 같은 식으로 처리 return; } int lch = now * 2; int rch = lch + 1; int m = (s + e) / 2; build(lch, s, m); build(rch, m + 1, e); tree[now] = Max(tree[lch], tree[rch]); } void update(int now, int s, int e, int tg, int val) { if (s == e) { tree[now] = val; return; } int lch = now * 2; int rch = lch + 1; int m = (s + e) / 2; if (tg <= m) update(lch, s, m, tg, val); else update(rch, m + 1, e, tg, val); tree[now] = Max(tree[lch], tree[rch]); } int query(int now, int s, int e, int qs, int qe) { // 찾고자하는 범위가 트리의 범위에 없으면 리턴 0 if (e < qs || qe < s) return 0; // 찾고자하는 범위 안에 트리의 범위가 있으면 전체 리턴 if (qs <= s && e <= qe) return tree[now]; int lch = now * 2; int rch = lch + 1; int m = (s + e) / 2; int lv = query(lch, s, m, qs, qe); int rv = query(rch, m + 1, e, qs, qe); return Max(lv, rv); } int main() { build(1, 1, N); //update(1, 1, N, 2, 7); int v = query(1, 1, N, 2, 3); printf("%d\n", v); return 0; } | cs |
'공부 > 알고리즘' 카테고리의 다른 글
정렬(sort) 관련 (0) | 2020.12.09 |
---|---|
부분합 문제 (0) | 2020.12.07 |
기본 dfs, bfs (0) | 2020.12.01 |
hash key 관련 (0) | 2020.12.01 |
DLL + hash 2개 (0) | 2020.11.28 |