Gravatar
Emine
积分:874
提交:247 / 454
首先广搜有20分
对于一个状态
例如2 3 7
中间可以往两侧跳,即2 3 7->1 2 7 / 2 3 7->2 7 11
两侧仅有一个能往中间跳,即2 3 7->3 4 7
那么所有的状态就能表示为一棵二叉树,第一种情况为其两个儿子,第二种为其父亲
问题转换为给定树上的两个结点,求其距离
直接暴力可以得40分
可以构造这样的数据
1 2 1000000000
99999998 99999999 1000000000
这样左边要一直往中间跳上上亿次
我们发现若记前两个数差t1,后两个数差t2,不妨设t1<t2
则左边最多往中间跳(t2-1)/t1次
然后只能右边往中间跳,是一个辗转相除的过程,即在logK的时间内我们可以用这种方法得到某个结点它向上K次后的结点,或者根节点,同时还可以顺便算下深度
那么只要求始终两个状态的深度d1,d2,将较深的调整到同一深度
然后二分/倍增求与lca的深度差x
ans=2*x+abs(d1-d2)

Gravatar
cstdio
积分:4755
提交:1198 / 2108
这思路太机智了……