본문 바로가기

자료구조/Link Cut Tree

[Link Cut Tree] 4. 쿼리

이번 글에서는 트리에서의 경로 합을 구해봅시다.
일단 루트에서 노드 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을 구할 수 있도록 수정합니다.


이제 쿼리를 구하는 함수를 만들어 주는데, 두가지 방법이 있습니다.