这是一道神题,不看题解永远我永远也不会和LCA扯上关系。不知道为什么会出现在“NOIP 500+”这样的书里...

首先,对于递增的三个坐标(x,y,z),有三种走法:

1,y向x方向跳,得到(2x-y,x,z)可以发现这是扩大了边界。

2,y向z方向跳,得到(x,z,2z-y)可以发现这是扩大了边界。

3,设d1=y-x, d2=z-y, 如果d1>d2,z可以跳到x,y中间,得到(x,2y-z,y);或者d2>d1,x可以跳到y,z中间得到(y,2y-x,z);由于每个坐标只能放一个棋子,所以当d1=d2时不能往中间走。可以发现这是缩小了边界。

这不就是一棵树吗?前两种为左右儿子,第三种为父亲。

进一步思考,按照前两种走法,可以走无限步,且数字越来越大,不可取。按第三种走法,步数有限且数字减小,而且走法唯一,那么我们就把给出的初始状态与目标状态同时按第三种走法走到不能再走为止,看得到的是不是相同,若不相同则输出NO。也就是在树上看根是否相同。

如果可行,说明两个节点在同一棵树上,那么一般只需求出LCA即可。但这题状态太多,无法存储。

于是想到先把两个节点跳到同一深度 ,再二分两个节点到LCA的距离。

但还有个贯穿始终的问题:上跳时,第3种方法一次一次跳会超时。以d1<d2为例,直接跳到d1=d2或者d1>d2为止,如图:

直接跳了d2/d1步,有点类似欧几里得求gcd。此时d1不变,d2变成d2%d1。接下来z又向v方向跳即可,依此类推,直到不能再跳。

详见代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;LL get(LL a,LL b,LL c,LL &dep,LL &len)
{LL d1=b-a,d2=c-b;while(d1!=d2){if(d1<d2){LL step=d2/d1, rest=d2%d1;if(rest==0){dep+=step-1;a+=d1*(step-1);len=d1; return a;}d2=rest; a+=d1*step; b+=d1*step; dep+=step;}else{LL step=d1/d2, rest=d1%d2;if(rest==0){dep+=step-1;len=d2; return a;}d1=rest; c-=d2*step; b-=d2*step; dep+=step;}}dep=0; len=d1; return a;
}void getfa(LL &a,LL &b,LL &c,LL mid)
{LL d1=b-a,d2=c-b;while(mid){if(d1<d2){LL step=d2/d1, rest=d2%d1;if(step>=mid){a+=d1*mid; b+=d1*mid;if(b==c){b=a;a=b-d1;}return;}mid-=step; d2=rest; b=c-rest; a=b-d1;}else{LL step=d1/d2, rest=d1%d2;if(step>=mid){c-=d2*mid; b-=d2*mid;if(b==a){b=c;c=b+d2;}return;}mid-=step; d1=rest; b=a+rest; c=b+d2;}}
}int main()
{LL ori[3],goal[3],dep1=0,dep2=0,len1,len2;cin>>ori[0]>>ori[1]>>ori[2];cin>>goal[0]>>goal[1]>>goal[2];sort(ori,ori+3); sort(goal,goal+3);LL a1=get(ori[0],ori[1],ori[2],dep1,len1);LL a2=get(goal[0],goal[1],goal[2],dep2,len2);if(a1!=a2||len1!=len2){cout<<"NO";return 0;}cout<<"YES"<<'\n';LL cnt=0;if(dep1>dep2){cnt=dep1-dep2;getfa(ori[0],ori[1],ori[2],dep1-dep2);}else if(dep2>dep1){cnt=dep2-dep1;getfa(goal[0],goal[1],goal[2],dep2-dep1);}LL L=0,R=min(dep1,dep2),mid,ans=0,a,b,c,x,y,z;while(R>=L){mid=(L+R)/2;getfa(a=ori[0],b=ori[1],c=ori[2],mid);getfa(x=goal[0],y=goal[1],z=goal[2],mid);if(a==x&&b==y&&c==z){ans=mid*2;R=mid-1;}else L=mid+1;}cout<<cnt+ans;return 0;
}

【国家集训队】跳跳棋(LCA+二分答案)相关推荐

  1. BZOJ2144跳跳棋——LCA+二分

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  2. [BZOJ2144]国家集训队 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  3. 洛谷 P1852 [国家集训队] 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  4. 跳跳棋[LCA+二分查找]-洛谷1852

    传送门 这真是一道神仙题 虽然我猜到了这是一道LCA的题 但是... 第一遍看题,我是怎么也没想到能和树形图扯上关系 并且用上LCA 但其实其实和上一道lightoj上的那道题很类似 只不过那时一道很 ...

  5. P1852 [国家集训队]跳跳棋

    这什么神题啊- https://www.luogu.org/problemnew/show/P1852 想了一个小时一点儿思路也没(头里只有爆搜) 看了题解才知道是树-这谁顶的住啊 考虑中间点到两边距 ...

  6. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  7. 【NOIP2015】D2-T1跳石头,二分答案

    如果这道题没有写60分的堆加贪心而是二分,如果我在考试前我能写一道自己一直在躲避的二分答案,如果我能骗到第三题哪怕15分,结果都会不同,可惜没如果-- ------------------------ ...

  8. bzoj2144: 跳跳棋(二分/倍增)

    思维好题! 可以发现如果中间的点要跳到两边有两种情况,两边的点要跳到中间最多只有一种情况. 我们用一个节点表示一种状态,那么两边跳到中间的状态就是当前点的父亲,中间的点跳到两边的状态就是这个点的两个儿 ...

  9. NOIP2015跳石头【二分答案(最小值最大化) | 贪心】

    519. 跳石头 - AcWing题库 组委会已经选择好了两块岩石作为比赛起点 0 和终点 L . 在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石). 在比赛过程中,选手们将从起点出发,每一 ...

  10. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

最新文章

  1. iOS 直播专题6-流媒体服务器
  2. webbrowser1 脚本报错_c# winform程序 webBrowser 当前页面的脚本发生异常 找不到成员...
  3. 没听说过这些,就不要说你懂并发了,three。
  4. linux grep 基本正则表达式与扩展正则表达式使用解析
  5. 实现一个可管理、增发、兑换、冻结等高级功能的代币
  6. Android 一直往文件写数据_( 十 ) 小众但好用:通过 Google drive 备份与同步 Keepass 数据库...
  7. 《Python Cookbook 3rd》笔记(5.14):忽略文件名编码
  8. 一个简单的Makefile模板
  9. 信息学奥赛一本通 1956:【11NOIP普及组】表达式的值 | 洛谷 P1310 [NOIP2011 普及组] 表达式的值
  10. 声明 static 变量注意事项
  11. MyBatis 多表关联相同字段的解决方案
  12. java 加入音乐_如何实现java插入背景音乐
  13. 雅猴的脚印——2019年上半年
  14. 上古卷轴5json文件修改_《上古卷轴5》丝袜MOD制作图文教程 丝袜怎么制作
  15. python求单词长度_python 统计单词平均长度,统计a出现的次数
  16. 03-日志汇总,处理和安全分析
  17. 企业级购物车实现思路
  18. 小技巧:小米手机和小米电脑“勾搭”也能组建家庭安防监控
  19. dojo引用html模板,深入浅出dojo/request-本地HTML文件 带参数方案-遮罩层《一》_169IT.COM...
  20. python身份证验证系统_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

热门文章

  1. 微信小程序项目-uniapp黑马优购
  2. java 多线程详细(转载)
  3. 操作系统和内核有什么区别?
  4. 微信与QQ聊天记录从旧电脑到新电脑之间无缝备份迁移
  5. Java 生成数字证书系列(三)生成数字证书
  6. html太极旋转css,前端CSS技巧之太极旋转图详解
  7. iMeta | 北大陈峰/陈智滨等发表口腔微生物组研究中各部位取样的实验方法(Protocol)...
  8. chromium 浏览器多进程架构小科普
  9. 2020年10月计算机语言排名,最新!2020年10月编程语言排行榜出炉
  10. linux 下不错的html编辑器bluefish