LCA 문제다.


완전 K진 트리에서 부모를 찾아가려면 (+(k-2))/k 하면 된다.


나는 depth를 구하고 했는데 완전 k진 트리의 특성을 생각해보면 depth를 구하지 않아도 된다.


a<b일 때 depth(a)<=depth(b) 가 보장되기 때문에 a,b 대소관계만 비교해도 된다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
 
typedef long long ll;
 
ll n, k, Q;
 
ll find_depth(ll x) {
    ll mod = 1;
    ll depth = 0;
    while (x > 0) {
        x -= mod;
        mod *= k;
        depth++;
    }
    return depth;
}
 
int main() {
    scanf("%lld%lld%lld"&n, &k, &Q);
    if (k == 1) {
        ll u, v;
        while (Q--) {
            scanf("%lld%lld"&u, &v);
            printf("%lld\n", u > v ? u - v : v - u);
        }
        return 0;
    }
    while (Q--) {
        ll u, v, d1, d2, ans = 0;
        scanf("%lld%lld"&u, &v);
        d1 = find_depth(u);
        d2 = find_depth(v);
        while (d1 > d2) {
            u = (u + k - 2/ k;
            d1--;
            ans++;
        }
        while (d2 > d1) {
            v = (v + k - 2/ k; 
            d2--;
            ans++;
        }
        while (u != v) {
            u = (u + k - 2/ k;
            v = (v + k - 2/ k;
            ans += 2;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

11559 Puyo Puyo  (0) 2018.02.18
4963 섬의 개수  (0) 2018.02.18
1761 정점들의 거리  (0) 2018.02.17
11437 LCA  (0) 2018.02.17
3111 검열  (0) 2018.02.17

+ Recent posts