3. 우리가 기존에 알고 있는 자료구조인 pen wick tree나 segment tree를 이용해서
해당 점을 추가하거나 값을 구할 수 있다.
해당 점 추가는 N*N 사이즈의 크기라면 시간복잡도는 O(log N) 이나
만약 (x,y)까지의 점의 개수를 구하고자 할 때는 O(N log N)의 시간복잡도가 요구된다.
6. 기존 1차원 segment tree
(x,y)
(x,(x+y)/2) ((x+y)/2+1,y)와 같이 2개로 분할한다면
pos ,(x1,y1,x2,y2)를
pos*4-2,(x1,y1,(x1+x2)/2,(y1+y2)/2)
pos*4-1, ((x1+x2)/2+1,y1,x2,(y1+y2)/2)
pos*4, (x1,(y1+y2)/2+1,(x1+x2)/2,y2)
pos*4+1 ((x1+x2)/2+1,y1,x2,(y1+y2)/2)
와 같이 4개의 노드로 분할한다.
10. 2D pen wick Tree
왠지 느낌상 1차원 펜윅트리를 구하던 방식을
x,y에 대해서 비슷하게 구하면 될 것 같다.
근데 실제로 된다
실제 코드를 한번 보자
11. void update(int x , int y , int val){
int y1;
while (x <= max_x)
y1 = y;
while (y1 <= max_y){
tree[x][y1] += val;
y1 += (y1 & -y1);
}
x += (x & -x);
}
}
12. int query(int x,int y){
int ret=0;
int ty;
while(x){
ty= y;
while(ty){
ret+=pen[x][ty];
ty= ty&(ty-1);
}
x= x&(x-1);
}
return ret;
}
17. SPOJ MATSUM - Matrix
Summation
N*N 행렬에서 (x,y)의 값을 변형시키고
(x1,y1, x2,y2)까지의 값을 구하는 문제
시간제한 1초.
1<=N<=1024
18. 구글 APAC Test 2016 Round C
D번 gMatrix
NxN 크기의 매트릭스 M이 주어진다.
이때 (K<=N)인 K*K 크기의 서브매트릭스를 T라 하자.
M의 모든 k*k 크기의 서브매트릭스를 구해서
서브매트릭스의 최대 원소를 maxT라 할 때,
sum(maxT1,maxT2,….. maxT y)를 구하라.
(여기서 y는 M의 모든 k*k 서브매트릭스의 크기 )
제한조건:
(1<=k<=N<=3000)
제한시간:
대략 6~7분
19. 5 15
30
5 13
9
45
12
25
만약 N=3 이고 K=2 라면
아래의 그림과 같이 4개의 서브매트릭스가
나오고 각 최대값은
30,45,30,45가 되어서 구하는 값은
150이 된다.
5 15
30 25
15 9
25 45
30 25
5 13
25 45
13 12