Codeforce 287 div2 C题

题目链接:http://codeforces.com/contest/507/problem/C

解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRLR.....,L表示当前向左走,R表示现在向右走,然后如果碰到如果下一步的点是已经走过的,则跳过这条命令,如果下两步都是走过的话,则回到该节点的父节点。问从根结点走到出口一共到过多少个节点,包括出口节点,不包括根结点。

2e42de5cebf0bfdae7dd1e2ecf97673b77881867.png (650×500)

这是一棵满二叉树,现在假设出口的E那个点,从1出发,向左走,很显然,出口跟我现在所在的不是在同一棵子树上面,但是,可以肯定的一点是,在这种情况时,即我现在所在的子树跟出口不是在同一棵子树时,我一定会先把我当前所在的子树的所有节点都走一遍才会进入出口所在的子树上,利用这个特点,我们可以把时间复杂度简化到h,只要我每次判断当前所在的点是不是跟出口在同一课子树,如果是,继续向下走,如果不是,不用向下走了,只要加上我所在的这颗子树的节点的总个数就可以了。我一开始错在对long long 型数作位移运算时,没有对1进行强制转化声明,但是直接这样一个1放在那里默认的是int型的,所以位移运算时就会溢出,导致了我的代码在小数据时都没有问题,h达到39时,就怎么也不对了。这点要注意,以前很少对long long 型做过位移运算,这点以后要注意。

posted @ 2015-01-26 17:57  xiaxiaosheng  阅读(176)  评论(0编辑  收藏  举报