티스토리 뷰
서론
본론
2-1 ) Build
문제에서 원하는 부분이 최대값이라고 가정하자. 그러면, 최상위 노드에서는 1~8까지의 최대값을, 그 다음 노드에서는 1~4와 5~8까지... 이렇게 가서 원소 하나를 가르칠 때 까지 트리를 구성한다.
여기서, 중요한것은 구간 트리는 이진 트리라는 것이다. Binary Tree여서, i의 원소에서 퍼져나갈 때에는 2*i와 2*i+1로 퍼져나간다.
2-2) Update
2-3) Answer
본론-2) 구현
2-1) Build()
1 2 3 4 5 | void build() { for(int i=N-1; i >= 1; i--) t[i] = t[i << 1] + t[i << 1 | 1]; } | cs |
n<<1 = n*2, n|1 = n+1( n이 짝수 ), n( n이 홀수 )
앞에서 말했다시피, i번째 원소는 2*i과 2*i+1의 구간을 종합하여 만들어진다.
1 2 3 4 5 | void update(int pos, int val) { for(t[pos += N] = val; pos > 1; pos >>= 1) t[pos >> 1] = t[pos] + t[pos ^ 1]; } | cs |
n>>1 = n/2, n^1 = n+1( n이 짝수 ), n-1( n이 홀수 )
앞에서 말했다시피, i번째 원소가 갱신되면, i/2도 갱신해줘야 한다.
2-3) Answer()
1 2 3 4 5 6 7 8 9 10 11 12 | ll sum(int l, int r) { ll ans = 0; for(l += N, r += N; l < r; l >>= 1, r >>= 1) { if(l & 1) ans += t[l++]; if(r & 1) ans += t[--r]; } return ans; } | cs |
여기서 구간은 [l,r)이다.
l,r 구간에서 l이 들어가면 l+1도 들어간다.
그리고, build할 때 구간을 정할때 사용되는 두 값은 2*i와 2*i+1이다.
따라서, l이 짝수일 경우엔 l과 l+1 모두 구간에 들어가기 떄문에 위쪽으로 올라가주면 된다.
하지만, l이 홀수일 경우엔 l-1은 구간에 안들어가기 떄문에, 현재 l값을 바탕으로 답을 갱신해줘야 한다.
l이 홀수인지 조사하는 코드는 l&1이다
반대로, r이 홀수면 r과 r-1 모두 구간에 들어가기 떄문에 위쪽으로 올라가주면 된다.
하지만, r이 짝수면 r+1은 구간에 안들어가기 때문에, 현재 r값을 바탕으로 답을 갱신해줘야한다.
구간이 [l,r)이므로, r이 홀수가 되면 r을 하나 까고 그 깐 r을 갱신해준다.
ll은 long long 자료형의 줄임이고, 이는 icpc.me/2042를 기반으로 해서 짠 코드이다.
Build()할 때에는 총 2*N-1개의 원소를 갱신하므로 O(2N) = O(N)이 걸린다.
update() 할 떄에는, log N 번만큼 갱신이 필요하므로 O(log N)이 된다.
답을 구하는 과정도, l이 1이고 r이 N이라고 생각하면, 총 log N번 계산하므로 O(log N)이다.
따라서, 전처리는 O(N), 각 쿼리당 O(log N)해서 총 시간복잡도는
O(QlogN + N)이 된다.
결론
사람들은 누구보다 비재귀를 좋아하면서 왜 싫어하는척 할까?
비재귀가 한번 손에 익으면 벗어날 수 없다...
lazy propagation도 간단하다는 썰이 있다.
이는 아직 공부를 안해서.. 공부를 하고 포스팅을 하도록 하겠다
들리는 소문으로는 비재귀는 gcd 트리를 갱신못시킨다카더라..
'알고리즘' 카테고리의 다른 글
[Jungol] 동맹 ( World CodeSprinter 13 Competitve Teams ) (0) | 2018.06.21 |
---|---|
[BOJ] 3653 영화수집 (0) | 2018.06.02 |
JOI 18 , Stove (0) | 2018.05.30 |
LCA(Lowest Common Ancestor) (0) | 2018.05.29 |
문제 풀이 의식적 흐름( IOI 2014, Game ) - 도전중 (0) | 2018.05.28 |
- Total
- Today
- Yesterday
- mathematics
- PMA
- 17411
- 해석학II
- 선형대수학
- 수학
- PMA Ch5
- 연습문제
- 백준
- Trace trick
- 해석학 Ch5
- Derivate
- Backprop
- JOI 2021
- 세그먼트 트리
- 백준 17411
- icpc.me/17411
- Machine Learning
- 해석학 Chapter 5
- Differentation
- Trace tirck
- joi
- 미분
- 해석학
- LInear SVM
- PMA 연습문제
- 로피탈
- 수(상)
- Deep learning
- cs231n assignment1
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |