티스토리 뷰
반응형
✏️ 세그먼트 트리 기본 개념
https://pooreumjung.tistory.com/305
문제 풀기 전에 보시면 도움이 됩니다!
✏️ 문제 링크
https://www.acmicpc.net/problem/2357
✏️ 문제 설명
✏️ 문제 코드
#include<iostream>
#include<vector>
#include<cmath>
#include<limits.h>
using namespace std;
vector<long>treeMin;
vector<long>treeMax;
void setMin(int i);
void setMax(int i);
long getMin(int start, int end);
long getMax(int start, int end);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
int length = N;
int treeHeight = 0;
while (length != 0) {
length /= 2;
treeHeight++;
}
int treeSize = int(pow(2, treeHeight + 1));
int nodeLeftStatrIndex = treeSize / 2 - 1;
treeMin.resize(treeSize + 1);
treeMax.resize(treeSize + 1);
fill(treeMin.begin(), treeMin.end(), LONG_MAX);
for (int i = nodeLeftStatrIndex + 1; i <= N + nodeLeftStatrIndex; i++) {
cin >> treeMin[i];
treeMax[i] = treeMin[i];
}
setMin(treeSize - 1);
setMax(treeSize - 1);
for (int i = 0; i < M; i++) {
int start, end;
cin >> start >> end;
start += nodeLeftStatrIndex;
end += nodeLeftStatrIndex;
cout << getMin(start, end) << " " << getMax(start, end) << '\n';
}
}
void setMin(int i) {
while (i != 1) {
treeMin[i / 2] = min(treeMin[i / 2], treeMin[i]);
i--;
}
}
void setMax(int i) {
while (i != 1) {
treeMax[i / 2] = max(treeMax[i / 2], treeMax[i]);
i--;
}
}
long getMin(int start, int end) {
long partMin = 1000000001;
while (start <= end) {
if (start % 2 == 1) {
partMin = min(partMin, treeMin[start]);
start++;
}
if (end % 2 == 0) {
partMin = min(partMin, treeMin[end]);
end--;
}
start /= 2;
end /= 2;
}
return partMin;
}
long getMax(int start, int end) {
long partMax = 0;
while (start <= end) {
if (start % 2 == 1) {
partMax = max(partMax, treeMax[start]);
start++;
}
if (end % 2 == 0) {
partMax = max(partMax, treeMax[end]);
end--;
}
start /= 2;
end /= 2;
}
return partMax;
}
✏️ 문제 링크
https://www.acmicpc.net/problem/1275
✏️ 문제 설명
✏️ 문제 코드
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<long>tree;
void setTree(int i);
long getSum(int start, int end);
void changeVal(int index, long value);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
int length = N;
int treeHeight = 0;
while (length != 0) {
length /= 2;
treeHeight++;
}
int treeSize = int(pow(2, treeHeight + 1));
int nodeLeftStartIndex = treeSize / 2 - 1;
tree.resize(treeSize + 1);
for (int i = nodeLeftStartIndex+1; i <= N+nodeLeftStartIndex; i++)
cin >> tree[i];
setTree(treeSize - 1);
for (int i = 0; i < M; i++) {
long x, y, a, b;
cin >> x >> y >> a >> b;
if (x > y)
swap(x, y);
long start = x + nodeLeftStartIndex;
long end = y + nodeLeftStartIndex;
cout << getSum(start, end) << '\n';
int index = a + nodeLeftStartIndex;
changeVal(index, b);
}
}
void setTree(int i) {
while (i > 1) {
tree[i / 2] += tree[i];
i--;
}
}
long getSum(int start, int end) {
long sum = 0;
while (start <= end) {
if (start % 2 == 1) {
sum += tree[start];
start++;
}
if (end % 2 == 0) {
sum += tree[end];
end--;
}
start /= 2;
end /= 2;
}
return sum;
}
void changeVal(int index, long value) {
long diff = value - tree[index];
while (index > 0) {
tree[index] += diff;
index /= 2;
}
}
✏️ 문제 링크
https://www.acmicpc.net/problem/2268
✏️ 문제 설명
✏️ 문제 코드
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<long>tree;
long getSum(int start, int end);
void changeVal(int index, long value);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
int length = N;
int treeHeight = 0;
while (length != 0) {
length /= 2;
treeHeight++;
}
int treeSize = int(pow(2, treeHeight + 1));
int nodeLeftStartIndex = treeSize/2 - 1;
tree.resize(treeSize + 1);
for (int i = 0; i < M; i++) {
long a, b, c;
cin >> a >> b >> c;
if (a == 0) {
if (b > c)
swap(b, c);
int start = b + nodeLeftStartIndex;
int end = c + nodeLeftStartIndex;
cout << getSum(start, end) << '\n';
}
else if (a == 1) {
int index = b + nodeLeftStartIndex;
changeVal(index, c);
}
}
}
void changeVal(int index, long value) {
long diff = value - tree[index];
while (index > 0) {
tree[index] += diff;
index /= 2;
}
}
long getSum(int start, int end) {
long sum = 0;
while (start <= end) {
if (start % 2 == 1) {
sum += tree[start];
start++;
}
if (end % 2 == 0) {
sum += tree[end];
end--;
}
start /= 2;
end /= 2;
}
return sum;
}
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[C/C++] 백준 2056번 - 작업 (0) | 2024.04.02 |
---|---|
[C/C++] 백준 - 수열과 쿼리 문제 (0) | 2024.03.30 |
[C/C++] 백준 2470번 - 두 용액 / 백준 2467번 - 두 용액 (0) | 2024.03.02 |
[C/C++] 백준 1517번 - 버블 소트 (0) | 2024.03.02 |
[C/C++] 백준 28278번 (0) | 2024.03.02 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이분 매칭
- Do it!
- CSS
- 알고리즘
- 자바스크립트
- 에라토스테네스의 체
- 유클리드 호제법
- html
- 세그먼트 트리
- java
- 스프링 부트 crud 게시판 구현
- C++
- 알고리즘 공부
- C++ Stack
- 카운팅 정렬
- DP
- 우선순위 큐
- 백준
- 투 포인터
- 스택
- 백준 풀이
- 자바
- 유니온 파인드
- c++ string
- 반복문
- HTML5
- 자료구조
- js
- BFS
- DFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함