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 |