PS/Algorithms
[Java] Segment Tree
CalicoCat22
2022. 3. 14. 13:36
https://www.acmicpc.net/blog/view/9
세그먼트 트리 (Segment Tree)
글이 업데이트 되었습니다. https://book.acmicpc.net/ds/segment-tree 문제 배열 A가 있고, 여기서 다음과 같은 두 연산을 수행해야하는 문제를 생각해봅시다. 구간 l, r (l ≤ r)이 주어졌을 때, A[l] + A[l+1] + ..
www.acmicpc.net
https://steady-coding.tistory.com/126
[BOJ] 백준 2357번 : 최솟값과 최댓값 (JAVA)
문제 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수, 또는 제일 큰 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M
steady-coding.tistory.com
tree.size = 4 * n
1번칸은 1~n 번 중 최소값
2번칸은 1~mid, 3번칸은 mid+1~n중 최소값
(mid = (lo + hi) / 2)
static int minUpdate(int lo, int hi, int node){
if (lo == hi){
return mintree[node] = pp[lo];
}
int mid = (lo + hi) / 2;
return mintree[node] = Math.min(minUpdate(lo, mid, node * 2), minUpdate(mid + 1, hi, node * 2 + 1));
}
static int maxUpdate(int lo, int hi, int node){
if (lo == hi){
return maxtree[node] = pp[lo];
}
int mid = (lo + hi) / 2;
return maxtree[node] = Math.max(maxUpdate(lo, mid, node * 2), maxUpdate(mid + 1, hi, node * 2 + 1));
}
left, right 내부에 lo, hi가 있다면
그 범위 내의 최소값을 반환
static int minFind(int lo, int hi, int node, int left, int right){
if (right < lo || hi < left){
return Integer.MAX_VALUE;
}
if (left <= lo && hi <= right){
return mintree[node];
}
int mid = (lo + hi) / 2;
return Math.min(minFind(lo, mid, node * 2, left, right), minFind(mid + 1, hi, node * 2 + 1, left, right));
}
static int maxFind(int lo, int hi, int node, int left, int right){
if (right < lo || hi < left){
return -1;
}
if (left <= lo && hi <= right){
return maxtree[node];
}
int mid = (lo + hi) / 2;
return Math.max(maxFind(lo, mid, node * 2, left, right), maxFind(mid + 1, hi, node * 2 + 1, left, right));
}