【2017.11.09】noip赛前集训 | T1 三向城【lca】
【题意】
三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口。(来自取名力为0的出题人)
具体来说,城中有无穷多个路口,每个路口有唯一的一个正整数标号。除了1号路口外,每个路口都连出正好3条道路通向另外3个路口:编号为x(x>1)的路口连出3条道路通向编号为x*2,x*2+1和x/2(向下取整)的3个路口。1号路口只连出两条道路,分别连向2号和3号路口。
所有道路都是可以双向通行的,并且长度都为1。现在,有n个问题:从路口x到路口y的最短路长度是多少?
【题解】
正好做过那天洛谷的比赛,和第一题一样的,找LCA。
这题中编号为x(x>1)的路口连出3条道路通向编号为x*2,x*2+1和x/2(向下取整),所以找一个点的父亲很容易,不断找两个点的父亲,然后 ans = node[x].deep + node[y].deep - 2 * node[lca(x, y)].deep。
node[x].deep = (int)log2(x);
#include <cstdio>
int n;
int main() {
// freopen("city.in", "r", stdin);
// freopen("city.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int x, y, xx, yy;
scanf("%d%d", &x, &y);
xx = x, yy = y;
while (x != y && x != 1 && y != 1) {
if (x > y) x /= 2;
else y /= 2;
// printf("%d %d\n", x, y);
}
x = (x > y ? y : x);
int ans = (int)log2(xx) + (int)log2(yy) - 2 * (int)log2(x);
printf("%d\n", ans);
}
return 0;
}

浙公网安备 33010602011771号