문제
11658. 구간 합 구하기 3 : https://www.acmicpc.net/problem/11658
11658번: 구간 합 구하기 3
첫째 줄에 표의 크기 N과 수행해야 하는 연산의 수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는
www.acmicpc.net
문제 이해하기
- 2차원 표에서 구간의 합을 구해야 합니다.
- 합을 구하는 문제이기 때문에 펜윅트리를 사용할 수 있습니다.
- 하지만 1차원 배열을 활용한 펜윅트리로는 제한된 시간 안에 해결할 수 없습니다.
- 데이터가 2차원 표이기 때문에 제한시간 내 해결하기 위해서는 2차원 펜윅트리(2D 펜윅트리)를 만들어야 합니다.
문제 해결하기
- 2D 펜윅트리에서의 갱신은 1차원 펜윅트리와 유사합니다. 차이점은 2차원으로 처리한다는 점입니다.
- 각 행에 대해 열을 계속 갱신하면 됩니다. >> 중첩 반복문을 사용합니다.
예를 들어, 표에서 (i, j)의 값을 갱신하면 i의 값이 n보다 커지기 전까지 j를 계속 갱신하면 됩니다. - 2D 펜윅트리에서의 탐색 또한 갱신과 동일합니다. 각 행에 대해 열의 값을 모두 탐색하면 됩니다.
다만, (x1, y1) ~ (x2, y2)의 값을 구하기 위해서는 2차원 배열에서의 구간 합 방식을 사용해야 합니다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#include <stdio.h>
#include <vector>
#define NMAX 1050
#define SWAP(a,b,t) (t=a,a=b,b=t)
// input
int n, m;
int op, x1, y1, x2, y2, c;
int inp[NMAX][NMAX];
// 2D Fenwick Tree
int sz, t;
int BIT[NMAX][NMAX];
// result
int ret;
std::vector< int > ans;
void update(int x, int y, int val) {
int pos;
// 2D Fenwick Tree
while(x<=n) {
pos = y;
while(pos<=n) {
BIT[x][pos] += val;
pos += (pos & -pos);
}
x += (x & -x);
}
}
int search(int x, int y) {
int pos, ret;
// 2D Fenwick Tree
ret = 0;
while(x>0) {
pos = y;
while(pos>0) {
ret += BIT[x][pos];
pos -= (pos & -pos);
}
x -= (x & -x);
}
return ret;
}
int main() {
scanf("%d %d", &n, &m);
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
scanf("%d", &inp[i][j]);
update(i, j, inp[i][j]);
}
}
for(int q=1;q<=m;q++) {
scanf("%d", &op);
switch(op) {
case 0:
scanf("%d %d %d", &x1, &y1, &c);
update(x1, y1, c-inp[x1][y1]);
inp[x1][y1] = c;
break;
default:
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
ret = search(x2, y2) - search(x2, y1-1) - search(x1-1, y2) + search(x1-1, y1-1);
ans.push_back(ret);
}
}
for(int val:ans) printf("%d\n", val);
}
|
cs |
후기
2차원 펜윅트리를 직접 배워볼 수 있는 기회가 되었습니다. 펜윅트리에 능숙해진 후에 문제를 풀어보면 좋을듯 합니다.
참고 자료
- 펜윅 트리 : www.acmicpc.net/blog/view/21
펜윅 트리 (바이너리 인덱스 트리)
블로그: 세그먼트 트리 (Segment Tree) 에서 풀어본 문제를 Fenwick Tree를 이용해서 풀어보겠습니다. Fenwick Tree는 Binary Indexed Tree라고도 하며, 줄여서 BIT라고 합니다. Fenwick Tree를 구현하려면, 어떤 수 X
www.acmicpc.net
- 2D 펜윅 트리 : www.quora.com/How-do-I-implement-a-2D-binary-indexed-tree-for-range-update-and-range-query-operations
How do I implement a 2D binary indexed tree for range update and range query operations?
Answer: I would be glad to answer this Question as i spent much of my time trying to find 2D Binary indexed tree (Fenwick) for range update and range Query operation, so that it can help others. There does not exist any such standard algorithm or it is ver
www.quora.com
'문제 노트 > 백준' 카테고리의 다른 글
구간 합 구하기( BOJ 2042 ) (0) | 2021.03.24 |
---|---|
구간 합 구하기 4( BOJ 11659 ) (0) | 2021.03.18 |
굉장한 학생( BOJ 2336 ) (0) | 2021.03.13 |
Fine Dining( BOJ 16763 ) (0) | 2020.12.13 |
Cowpatibility( BOJ 16764 ) (0) | 2020.12.13 |