반응형
구간합
#include <algorithm>
#include <vector>
using namespace std;
int segTree[100000];
int N, M;
void update(int n, int s, int e, int ii, int val) {
if (s > ii || ii > e) return;
segTree[n] += val;
if (s == e) return;
int m = (s + e) / 2;
update(n * 2, s, m, ii, val);
update(n * 2 + 1, m + 1, e, ii, val);
}
int query(int n, int s, int e, int l, int r) {
if (e < l || s > r) return 0;
if (s >= l && e <= r) return segTree[n];
int m = (s + e) / 2;
int a = query(n * 2, s, m, l, r);
int b = query(n * 2 + 1, m + 1, e, l, r);
return a + b;
}
구간합 + 최대, 최소
#include <algorithm>
#include <vector>
using namespace std;
struct Node {
int sum;
int maxVal;
int minVal;
};
Node segTree[100000]; // 세그먼트 트리
int N, M;
void update(int n, int s, int e, int ii, int val) {
if (s > ii || ii > e) return; // 범위 벗어나면 리턴
if (s == e) {
segTree[n].sum = segTree[n].maxVal = segTree[n].minVal = val;
return;
}
int m = (s + e) / 2;
update(n * 2, s, m, ii, val); // 왼쪽 자식 업데이트
update(n * 2 + 1, m + 1, e, ii, val); // 오른쪽 자식 업데이트
// 구간 합, 최대값, 최소값 갱신
segTree[n].sum = segTree[n * 2].sum + segTree[n * 2 + 1].sum;
segTree[n].maxVal = max(segTree[n * 2].maxVal, segTree[n * 2 + 1].maxVal);
segTree[n].minVal = min(segTree[n * 2].minVal, segTree[n * 2 + 1].minVal);
}
Node query(int n, int s, int e, int l, int r) {
if (e < l || s > r) return {0, -1e9, 1e9}; // 범위를 벗어나면 초기값 리턴
if (s >= l && e <= r) return segTree[n]; // 구간이 완전히 포함될 때
int m = (s + e) / 2;
Node left = query(n * 2, s, m, l, r); // 왼쪽 자식 쿼리
Node right = query(n * 2 + 1, m + 1, e, l, r); // 오른쪽 자식 쿼리
// 쿼리 결과 병합
Node res;
res.sum = left.sum + right.sum;
res.maxVal = max(left.maxVal, right.maxVal);
res.minVal = min(left.minVal, right.minVal);
return res;
}
반응형
'PS > 알고리즘' 카테고리의 다른 글
프림(prim) 알고리즘 (0) | 2025.05.16 |
---|---|
위상 정렬(Topological Sort), BFS 기반 + 2차원 배열 (0) | 2025.05.12 |
이분탐색(lower_bound, upper_bound) (0) | 2025.05.09 |
트라이(trie) (0) | 2025.03.08 |
다익스트라(dijkstra) (0) | 2025.03.07 |