【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的最短路长度是多少?

【题解】

  同洛谷3938。

  正好做过那天洛谷的比赛,和第一题一样的,找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;
}

 

posted @ 2017-11-09 15:40  E-Valley  阅读(184)  评论(0)    收藏  举报