SlideShare a Scribd company logo
1 of 19
Download to read offline
Multi Dimension
Sement/penwick tree
만약 (1,1)에서부터 (x,y)까지 존재하는 점의 개수를 구하고, (x,y)상에 존재하는 점을
추가하거나 제거하고 싶다면????
(x,y)
우리가 기존에 알고 있는 자료구조인 pen wick tree나 segment tree를 이용해서
해당 점을 추가하거나 값을 구할 수 있다.
해당 점 추가는 N*N 사이즈의 크기라면 시간복잡도는 O(log N) 이나
만약 (x,y)까지의 점의 개수를 구하고자 할 때는 O(N log N)의 시간복잡도가 요구된다.
Sum 과 update를 모두 O(logN)으로 할 수는 없
을까??
2D- segment tree
기존 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개의 노드로 분할한다.
2D- segment tree
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)
메모리:O(N^2)
시간복잡도:
한 점의 업데이트는 O(log n)~O(log^2 n)
구간합을 구하는 쿼리는 O(log n) ~O(log^2 n)
으로 추측됨.
한 점을 업데이트하거나 구간의 합을 구하는 과정을 한번 살펴보자
2D pen wick Tree
왠지 느낌상 1차원 펜윅트리를 구하던 방식을
x,y에 대해서 비슷하게 구하면 될 것 같다.
근데 실제로 된다
실제 코드를 한번 보자
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);
}
}
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;
}
(5,3)을 업데이트하는 과정
query(x,y)=
(1,1)부터 (x,y)까지의 합을 구한다.
SUM(x1,y1,x2,y2)=
query(x2,y2)-query(x2,y1-1)-
query(x1-1,y2)+query(x1-1,y1-1)
SPOJ MATSUM - Matrix
Summation
N*N 행렬에서 (x,y)의 값을 변형시키고
(x1,y1, x2,y2)까지의 값을 구하는 문제
시간제한 1초.
1<=N<=1024
구글 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분
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

More Related Content

What's hot

정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
Flow based generative models
Flow based generative modelsFlow based generative models
Flow based generative models수철 박
 
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOSNAVER D2
 
이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4pkok15
 
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw정완 전
 
[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part
[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part
[한양대 aloha] 프로그래밍 경진대회 문제_Advanced partNAVER D2
 
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019Suhyun Park
 
cuda포스터-박일남
cuda포스터-박일남cuda포스터-박일남
cuda포스터-박일남DzH QWuynh
 
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5pkok15
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식 cancan21st
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03chl132435
 

What's hot (15)

정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
 
Flow based generative models
Flow based generative modelsFlow based generative models
Flow based generative models
 
이산수학04
이산수학04이산수학04
이산수학04
 
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS
 
이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4
 
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw
 
[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part
[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part
[한양대 aloha] 프로그래밍 경진대회 문제_Advanced part
 
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
 
cuda포스터-박일남
cuda포스터-박일남cuda포스터-박일남
cuda포스터-박일남
 
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
 
이산수학05
이산수학05이산수학05
이산수학05
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03
 

More from HYUNJEONG KIM

알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)
알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)
알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)HYUNJEONG KIM
 
shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이HYUNJEONG KIM
 
shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이HYUNJEONG KIM
 
shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이HYUNJEONG KIM
 

More from HYUNJEONG KIM (9)

알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
 
알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)
 
알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
 
알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)
알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)
알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)
 
shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이
 
shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이
 
shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이
 

알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)

  • 2. 만약 (1,1)에서부터 (x,y)까지 존재하는 점의 개수를 구하고, (x,y)상에 존재하는 점을 추가하거나 제거하고 싶다면???? (x,y)
  • 3. 우리가 기존에 알고 있는 자료구조인 pen wick tree나 segment tree를 이용해서 해당 점을 추가하거나 값을 구할 수 있다. 해당 점 추가는 N*N 사이즈의 크기라면 시간복잡도는 O(log N) 이나 만약 (x,y)까지의 점의 개수를 구하고자 할 때는 O(N log N)의 시간복잡도가 요구된다.
  • 4. Sum 과 update를 모두 O(logN)으로 할 수는 없 을까??
  • 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개의 노드로 분할한다.
  • 7. 2D- segment tree 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)
  • 8. 메모리:O(N^2) 시간복잡도: 한 점의 업데이트는 O(log n)~O(log^2 n) 구간합을 구하는 쿼리는 O(log n) ~O(log^2 n) 으로 추측됨.
  • 9. 한 점을 업데이트하거나 구간의 합을 구하는 과정을 한번 살펴보자
  • 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; }
  • 15.
  • 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