이번 글에서는 트리에서의 경로 합을 구해봅시다.
일단 루트에서 노드 x까지의 쿼리를 구할 수 있다면, 두 노드 사이의 쿼리는 LCA를 이용해서 구할 수 있습니다.
( query(x, y) = query(x, root) + query(y, root) - query(lca(x, y), root) - query(parent(lca(x, y)), root) )
struct node { node *l, *r, *p; int cnt, val, sum; node() : l(0), r(0), p(0), cnt(0), val(0), sum(0) {} };
일단 노드에 값과 구간 합을 저장하는 변수 val과 sum을 만들었습니다.
void update(node * x) { x->cnt = 1; x->sum = x->val; if (x->l) { x->cnt += x->l->cnt; x->sum += x->l->sum; } if (x->r) { x->cnt += x->r->cnt; x->sum += x->r->sum; } }
update 함수도 sum을 구할 수 있도록 수정합니다.
이제 쿼리를 구하는 함수를 만들어 주는데, 두가지 방법이 있습니다.
'자료구조 > Link Cut Tree' 카테고리의 다른 글
[Link Cut Tree] 6. 간선 쿼리 (0) | 2017.11.30 |
---|---|
[Link Cut Tree] 5. 구간 갱신(Lazy Propagation) (2) | 2017.09.08 |
[Link Cut Tree] 3. 연산 (2) (1) | 2017.09.06 |
[Link Cut Tree] 2. 연산 (1) (3) | 2017.08.29 |
[Link Cut Tree] 1. 개요와 구현 (3) | 2017.08.20 |