11/20 [세그먼트 트리] RMQ ( Range Minimum Query )
공부할땐 앞에 방법도 괜찮지만, 대회에서는 최소값 구할때 무조건 세그먼트 트리. 왜냐하면 이것은 O(sqrt(N))을 O(logN)으로 줄인것이기 때문이다.)
DP는 변경이 복잡해서 세그먼트트리가 무조건 좋다. 매우 중요한 자료구조니까 꼭 스스로 코딩해보세요.
11/23 [참고] 잠이와서 좀.. 소스코드 특히 다시 한번 보자.
12/13 필기하던거 다 날아감.ㅠㅠ
1. 루트N으로 나누기 sqrt decomposition
2. dp - 트리2에서 LCA랑 비슷하다.
앞쪽과 뒷쪽으로 나누는 dp
3. 세그먼트 트리 : 가장 좋은 방법 ( lgN) : 1,2번은 공부용으로 괜찮지만 실제는 무조건 세그먼트트리를 이용해야 한다.
post order
<참고>강의:
첫번째 주제: LCA를 세그먼트트리로 풀기
1. 프리오더로 모든 정점을 기록한다(abcbd이런식으로 돌아온정점도 모두 기록) 1+(n-1)x2 = 2n-1
2. 방문하면서 깊이도 같이 기록한다. 그런데 처음 방문했을때 순서도 기록한다.
3. 찾기, u와 v가 첫 등장한 인덱스 사이에서 깊이가 최소인 정점
두번째주제: 세그먼트 트리의 비재귀 구현-> 속도가 빨라서 사용하는 사람들 많다.
왼쪽의 오른쪽자식, 오른쪽의 왼쪽자식 인 경우에 점프하고, 아니면 그냥 올라다가 교차할때 그만두면됨.
11/23 [누적합], [펜윅트리]
12/13
세그먼트트리는 최소, 최대, 합을 구할수 있는 반면 펜윅트리는 합을 구할때만 쓴다.
누적합은 간단하지만 변경을 처리하는게 o(N)이다 어떤 값이 바뀌면 그 뒤에를 전부 업데이트 해야하기 때문이다.
2차원누적합.3차원누적합. 모두 포함배제의 원리를 이용해서 구한다. Inclusion-exclusion
다음동영상. 펜윅트리: 최소값을 구할때 사용할 수 없고, 합을 구할때만 사용할 수 있다.
펜윅트리는 누적합과 같지만 업데이트가 훨씬 빠른 lgN이어서 이용하는것이다. leetcode.com/tag/binary-indexed-tree/
2차원펜윅트리
그림보면 복잡하고 그냥 코드로
1차원배열의 1차원배열이 2차원인것처럼, 1차원펜윅트리의 1차원펜윅트리가 2차원펜윅트리다.
12/13 3가지 응용이 존재한다.
1. 최소값 찾기
2. 합
3. 위의 합을 이용해서 k번째를 찾는 문제
Longest Increasing Subsequence LIS는 O(N^2) dp문제, D[i] = A[i]가 마지막인 LIS의 길이 <- 너무 크다.
세그먼트 트리를 이용하면 되는데, 세그먼트 트리를 이용하는 문제들은 트리에 어떤수를 저장해야하는지 결정해야 한다.
기준은 3가지인데, 세그먼트트리를 이용하려면 구간이 나오도록 해야한다.
- 앞에있으면서 <- 이 조건은, 앞에서부터 차례대로 풀면 된다는 뜻.
- 작은 수 <- 구간으로 볼수 있다. A[i] = [1, A[i]-1]
- LIS길이의 "최대"
dp처럼 인덱스로 하면 안되고, tree[i] = 수 i를 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이로 정의함.
8분쯤에 A[i]로 증가하는 부분수열 tree[i]만드는 부분 와우..함.
2강 합구하기: 세그먼트 트리와 펜윅트리를 이용.