跳跳棋

问题描述

跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。

写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。

输入格式

第一行包含三个整数,表示当前棋子的位置a b c。(互不相同)第二行包含三个整数,表示目标位置x y z。(互不相同)

输出格式

如果无解,输出一行NO。如果可以到达,第一行输出YES,第二行输出最少步数。

样例输入

1 2 3
0 3 5

样例输出

YES
2

提示

20% 输入整数的绝对值均不超过10
40% 输入整数的绝对值均不超过10000
100% 绝对值不超过10^9


用一个三元数对(a,b,c)(a,b,c)表示当前棋子的位置,并且规定a<b<ca,观察棋子位置的改变,

如果b−a<c−bb-a,那么可以转移到 (b,2b−a,c)(b,2b-a,c)
反之,可以转移到 (a,2b−c,b)(a,2b-c,b)
此外,还可以转移到(2a−b,a,c)(2a-b,a,c)和(a,c,2c−b)(a,c,2c-b)

看起来很乱,但是注意到,bb向两边跳与两边向bb跳是互逆过程,因此我们不妨只考虑一个过程,考虑两边向中间跳的过程,那么每一个状态可以转移到的状态是唯一的,画个图就是

那么不难看出,从上往下走就是从中间往两边跳,从下往上走就是从两边往中间跳,于是,如果将每个状态看成一个节点,那么所有状态将会构成森林(注意不是树)

那么此题的解法也就比较明显了,即如果询问的两个节点不在一颗树中,那么无解,如果在一颗树中,最少跳动步数就是树上的距离。

那么接下来有两个问题,找根,和找lca

首先考虑找根,找根就是一个向上跳的过程,直到不能再向上跳,即b−a=c−bb-a=c-b

那么不妨考虑一个节点(x,y,z)(x,y,z),令a=y−x,b=z−ya=y-x,b=z-y
那么当a<ba时,每次xx跳到yy,zz中间,直到a>ba>b,那么每次跳使bb减少了aa,不妨设跳了k次,那么有k=(b−1)÷ak=(b-1)\div a,注意不能是b÷ab\div a,因为a=ba=b时不能跳,此时转移到了(x+ka,y+ka,z)(x+ka,y+ka,z)
因此只需要模拟欧几里德算法的过程,直到a=ba=b即可。

然后考虑找lca,找lca也是向上跳的过程,直到两个节点跳到同一个位置,注意到找根时可以算出深度,因此先将两个节点调整到同一深度,然后再二分跳的步数,如果跳到了同一个点,那么步数减小,反之步数增大,即可找到lca
至于向上跳,只需要在找根的向上跳的方法中加入一个步数限制即可。


代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
struct node{ll x,y,z;void SO(){if(x>y)swap(x,y);if(x>z)swap(x,z);if(y>z)swap(y,z);}
};
bool operator==(node a,node b)
{return a.x==b.x&&a.y==b.y&&a.z==b.z;}
ll step,ans;
node A,B,C,D;
node GO(node p,ll cnt)
{ll k;for(step=0;cnt;step+=k){ll a=p.y-p.x,b=p.z-p.y;if(a==b)return p;if(a<b){k=min((b-1)/a,cnt);p.x+=k*a;p.y+=k*a;cnt-=k;}else{k=min((a-1)/b,cnt);p.y-=k*b;p.z-=k*b;cnt-=k;}}return p;
}
int main()
{ll i,j,k,a,b,L,R;scanf("%lld%lld%lld",&A.x,&A.y,&A.z);A.SO();scanf("%lld%lld%lld",&B.x,&B.y,&B.z);B.SO();C=GO(A,1e18);a=step;D=GO(B,1e18);b=step;L=1;R=min(a,b);if(C==D)puts("YES");else {puts("NO");return 0;}if(a<b)B=GO(B,b-a);else A=GO(A,a-b);ans=step;if(A==B){printf("%lld",ans);return 0;}while(L<=R){k=L+R>>1;C=GO(A,k);D=GO(B,k);if(C==D)R=k-1;else L=k+1;}printf("%lld",ans+L*2);
}

BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)相关推荐

  1. BZOJ 2144 跳跳棋

    2144: 跳跳棋 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们 ...

  2. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...

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

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

  4. bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  5. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路: 转自:https://blog.csdn.net/u012288458 ...

  6. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

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

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

  8. [bzoj2144]: 跳跳棋

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 689  Solved: 326 [Submit][Status][Discuss ...

  9. bzoj-2144 跳跳棋

    2144: 跳跳棋 题目链接 时间限制: 10 Sec 内存限制: 259 MB 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一 个简单的游戏: ...

最新文章

  1. Linux如何让命令提示符显示完整的路径
  2. 中柏平板u盘启动_大数据时代,如何挑选大容量U盘?
  3. 新技术驱动新商业,网易创新企业大会亮点抢先看!
  4. numpy基础(part8)--符号数组与矢量化
  5. 2020 ICPC 上海 Sum of Log 数位dp + 状态剪枝
  6. Git管理代码常用术语
  7. kafka官方文档学习笔记3--配置简述
  8. Linux运维工程师工作内容总结
  9. excel颠倒顺序从下到上排列的两种方法
  10. Still,yet和already的用法
  11. 数据挖掘与数据分析项目链家租房数据(二)从性价比看链家推荐是否存在套路。
  12. Codeforces 1389 C. Good String(枚举)
  13. Android编程权威指南第三版 第31章
  14. 自定义指令,实现默认头像和用户上传头像的切换
  15. 数据结构与算法 知识点总结(中)---线性表,堆栈,队列
  16. 网购热催生网络模特月入万元多为大学生
  17. 在电脑上剪辑视频用什么软件 如何在电脑上剪辑视频
  18. 图像属性——老照片特效
  19. 弹性盒子 -- flex
  20. 【Python】Python Seaborn搞定线型回归图曲线

热门文章

  1. 论文阅读Construction of Refined Protein Interaction Network for Predicting Essential Proteins
  2. 人工智能 倒啤酒问题 python解法
  3. MATLAB工具箱——Classification Learner使用
  4. 红孩儿编辑器的渲染子系统的渲染模块的函数依赖关系图
  5. Cura参数设置-避免支撑拆除带来的困难
  6. (三十三)远期利率协议的结算金、价值与定价
  7. Voldemort的RoutedStore
  8. 12306html布局,12306-Assistant
  9. 【css的基础操作(css语言规范,字体,表格,类名)】
  10. 怎样屏蔽浏览器关闭按钮及ALT+F4 快捷键