[백준 2042] 구간 합 구하기
2020. 6. 14. 22:54ㆍComputer Science/Problem Solving (PS)
풀이
구간 합을 구하기 위해서 펜윅 트리를 사용하였습니다. 펜윅 트리에 대한 자세한 내용은 펜윅트리 포스팅을 참고해주세요
소스 코드 (JAVA)
import java.util.*;
public class BOJ_2042 {
public static void main(String args[]){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int k = input.nextInt();
long[] matrix = new long[n+1];
FenwickTree fenwick = new FenwickTree(n);
// initialize fenwick tree
for(int i=1;i<=n;i++){
matrix[i] = input.nextLong();
fenwick.update(i, matrix[i]);
}
for(int i=0;i<m+k;i++) {
int w = input.nextInt();
if (w == 1) {
int pos = input.nextInt();
long val = input.nextLong();
fenwick.update(pos, val - matrix[pos]);
matrix[pos] = val;
} else if (w == 2) {
int start = input.nextInt();
int end = input.nextInt();
long sum = fenwick.sum(end) - fenwick.sum(start-1);
System.out.println(sum);
}
}
}
static class FenwickTree {
long[] tree;
int n;
FenwickTree(int n) {
this.n = n;
this.tree = new long[n+1];
}
// calculate sum
public long sum(int pos) {
long sum = 0;
int temp = pos;
while(temp > 0) {
sum += this.tree[temp];
temp -= (temp & -temp);
}
return sum;
}
// update value
public void update(int pos, long val) {
int temp = pos;
while(temp <= this.n) {
this.tree[temp] += val;
temp += (temp & -temp);
}
}
}
}
반응형
'Computer Science > Problem Solving (PS)' 카테고리의 다른 글
[백준 6549 | 세그먼트 트리] 히스토그램에서 가장 큰 직사각형 (0) | 2020.06.20 |
---|---|
[백준 3653 | 펜윅 트리] 영화 수집 (0) | 2020.06.17 |
[백준 2263] 트리의 순회 (0) | 2020.03.21 |
[BOJ_10814 | Stable Sort] 나이순 정렬 (0) | 2019.07.10 |
[BOJ_1182 | DFS backtracking] 부분집합의 합 (0) | 2019.02.15 |