$O(q\lg _k{n})$
노드 번호가 1번부터 시작한다면 x의 부모는 (x-2)/k+1
두 노드의 공통 조상을 찾기 위해선 큰 번호의 노드를 부모로 거슬러 올리는 것을 반복하면 된다.
k=1인 경우에 이 방법으로는 시간초과가 날 수 있으므로 따로 처리해야한다.
#include<cstdio> #include<algorithm> using namespace std; long long n, x, y; int k, q; int main() { scanf("%d%d%d", &n, &k, &q); for (; q--;) { scanf("%lld%lld", &x, &y); if (k<2) { printf("%lld\n", abs(x - y)); continue; } int r = 0; while (x^y) { if (x<y) swap(x, y); x = (x - 2) / k + 1; r++; } printf("%d\n", r); } return 0; }
댓글 없음 :
댓글 쓰기