2차원 펜윅트리 이해하기(2-dimentional Fenwick Tree)
펜윅트리는 비트연산을 통해 빠른 시간에 구간합을 구하는 배열 형태의 트리이다. 이 글에서는 2차원 펜윅트리만을 설명하고 있다. 1차원 펜윅트리에 대한 이해가 필요하면 블로그 내 펜윅트리
uldada.tistory.com
해당 칸이 들어가는 tree 칸에 대해 전부 들어가야 하므로
각 x row에 대해 모든 y col 칸의 업데이트가 필요하다.
static void update(int x, int y, int v){
while (x <= n){
int temp_y = y;
while (temp_y <= n){
tree[x][temp_y] += v;
temp_y += (temp_y & -temp_y);
}
x += (x & -x);
}
}
static int sum(int x, int y){
int sum = 0;
while (x > 0){
int temp_y = y;
while (temp_y > 0){
sum += tree[x][temp_y];
temp_y -= (temp_y & -temp_y);
}
x -= (x & -x);
}
return sum;
}
합은 다음과 같이 구한다.
pw.println(sum(x2, y2) - sum(x1 - 1, y2) - sum(x2, y1 - 1) + sum(x1 - 1, y1 - 1));
'PS > Algorithms' 카테고리의 다른 글
[Java] Index Tree / Segment Tree Lazy Propagation (0) | 2022.03.15 |
---|---|
[Java] Segment Tree (0) | 2022.03.14 |
[Java] TSP (Traveling Salesperson Problem) - 모든 노드를 지나는 최소 길이 사이클 (0) | 2022.02.20 |
[Java] CCW (Counter Clock Wise) - 세 점의 방향성 파악 (0) | 2022.02.19 |
[Java] Topological Sort(위상 정렬) - 방향성 있으며 사이클 없는 그래프 (0) | 2022.02.13 |