题目重点是每次不能跳过两个棋子

即对于每一个棋子的状态(a,b,c) (a<b<c)

最多有两种移动的方式

1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b-c)

2.a或c往中间跳 当然要满足不跳过两个棋子

b-a<c-b a可以跳过b (a,b,c)-->(b,2b-a,c)

c-b<b-a c可以跳过b (a,b,c)-->(a,2b-c,b)

当然当c-b=b-a时就不能再往中间跳了

此时可以想到对于一个状态(a,b,c)如果一直往中间跳 最终的状态一定是一定的

于是可以把这个最终的状态看做是根节点 中间向左向右跳的状态分别是左右节点

这样就是一棵二叉树了,而询问两个状态能否相互跳到就是树上距离了

于是回顾lca求树上距离的过程,我们首先要确定一个状态的k层祖先的状态是什么

如果暴力跳的话就会超时,所以我们想一种特殊的情况

(1,100000000,100000001) 显然暴力跳会一直跳1的长度是不行的

但我们看这时b-a很大但c-b很小就意味着接下来会很多次都是c往b跳

能跳几次呢?因为棋子实际上没有区别 假如c跳过b 那么实际上就是c和b一起向左平移了c-b的距离

所以c往b跳的次数就是(b-a)/(c-b)

这样对于本题就可以达到取模gcd的速度快速求出一个状态的k层祖先状态

这样用lca的手法先让两点到达同一高度,再二分一个距离k,如果两种状态的k层祖先一直 则将k缩小,反之增大求出他们的最近公共祖先

#include<bits/stdc++.h>
using namespace std;
int ans,a,b,c,x,y,z,x1,yy1,z1,a1,b1,c1,t1,t2;
int read()
{int f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(x=x*10+ch-48,ch=getchar(),ch>='0'&&ch<='9');return x*f;
}
void SWAP(int &a,int &b,int &c){if(a>b){swap(a,b);if(a>c)swap(a,c);}if(b>c)swap(b,c);}
void back(int &a,int &b,int &c,int k)//将状态a,b,c回到k步前的状态 即它的k层祖先
{int A=b-a,B=c-b;if(A<B){int t=B/A;if(B%A==0)t--;if(t>=k){a=a+k*A;b=b+k*A;}else {a=a+t*A;b=b+t*A;back(a,b,c,k-t);}}else{int t=A/B;if(A%B==0)t--;if(t>=k){c=c-k*B;b=b-k*B;}else {c=c-t*B;b=b-t*B;back(a,b,c,k-t);}}
}
int getfa(int &a,int &b,int &c)//寻找状态a,b,c的根节点
{int A=b-a,B=c-b;if(A==B)return 0;if(A<B){int t=B/A;if(B%A==0)t--;a=a+t*A;b=b+t*A;return t+getfa(a,b,c);}else{int t=A/B;if(A%B==0)t--;c=c-t*B;b=b-t*B;return t+getfa(a,b,c);}
}
int comp(int a,int b,int c,int x,int y,int z){if(a==x&&b==y&&c==z)return 1;else return 0;}
int main()
{a=read();b=read();c=read();x=read();y=read();z=read();SWAP(a,b,c);SWAP(x,y,z);x1=x;yy1=y;z1=z;a1=a;b1=b;c1=c;t1=getfa(x1,yy1,z1);t2=getfa(a1,b1,c1);if(!comp(x1,yy1,z1,a1,b1,c1)){puts("NO");return 0;}if(t1<t2) back(a,b,c,t2-t1);else back(x,y,z,t1-t2);int l=0,r=min(t1,t2);while(l<=r){int mid=(l+r)>>1;x1=x;yy1=y;z1=z;a1=a;b1=b;c1=c;back(x1,yy1,z1,mid);back(a1,b1,c1,mid);if(comp(a1,b1,c1,x1,yy1,z1)) ans=mid,r=mid-1;else l=mid+1;}puts("YES");printf("%d",2*ans+max(t2,t1)-min(t2,t1));return 0;
}
/*
(a,b,c)if b-a<c-b --> (b,2b-a,c)
if c-b<b-a --> (a,2b-c,b)*/

转载于:https://www.cnblogs.com/DavidJing/p/10354511.html

[luogu]P1852跳跳棋相关推荐

  1. P1852 跳跳棋(建模LCA)

    P1852 跳跳棋(建模&LCA) 往外跳有个两个状态,往里跳只能有一个唯一父亲状态. 所以是一个二叉树. 将给定的起始和目标状态 向上找到根,判断是否相等.不相等无解. 否则类似求LCA的思 ...

  2. P1497[洛谷]P1852跳跳棋

    P1497[洛谷]P1852跳跳棋 标签(空格分隔): 信息 图论 二分 洛谷 考题,看到就觉得是不可能写出来的那种,于是打了个bfs直接走人. 考完之后听吕大佬讲过之后觉得此题可谓绝妙啊%%% 屁颠 ...

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

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

  4. 跳跳棋(国家集训队,LCA,洛谷P1852,BZOJ[2144])

    文章目录 题目 思路 代码 题目 题目链接 描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有333颗棋子,分别在a,b,ca,b ...

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

    P1852 [国家集训队]跳跳棋https://www.luogu.org/problemnew/show/P1852 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不 ...

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

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

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

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

  8. [数论系列一]C Looooops,跳跳棋,The Luckiest number,CF906D Power Tower,Minimal Power of Prime,仪仗队,LCMSUM

    文章目录 C Looooops description solution code 跳跳棋 description solution code The Luckiest number descript ...

  9. BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)

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

最新文章

  1. Request.getInputStrema只能读取一次的分析过程
  2. SpringBoot+JWT+Shiro+MybatisPlus实现Restful快速开发后端脚手架
  3. tar 解压缩命令详解
  4. linux关于程序的user,c – “get_user_pages”如何工作(对于linux驱动程序)
  5. springMVC分析-2
  6. 超链接标签/<a>标签
  7. 微信开发者工具 wxmi修改模版颜色_网站建设公司讲解:微信小程序的开发者工具界面...
  8. arraylist删除指定元素_【追凶】ArrayList使用增强for遍历删除元素异常ConcurrentModification...
  9. 值得学习实战8D来了!
  10. 已有项目要不要迁移到Addressable系统?
  11. 用计算机字符写名字,NSIS:把计算机名转换为大写或小写字符
  12. matlab怎么找出奇数个数_用MATLAB绘制系统根轨迹和性能分析
  13. 如果REST应用程序应该是无状态的,那么如何管理会话?
  14. 直播实录丨十年主导15个产品从0到1,她的经验与思考现场拆解
  15. Spring MVC 基于URL的映射规则(注解版)
  16. C#--扁平化窗体UI
  17. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
  18. 揭秘三位图灵奖得主Hinton、LeCun、Bengio的传奇人生
  19. 【Niagara 04】Tridium N4使用——生成报警信息
  20. [NiuKe-Exercise15] A.吉姆的运算式

热门文章

  1. 单位脉冲响应、单位阶跃响应的作用?
  2. 用eclipse出现java.lang.LayerInstantiationException: Package jdk.internal.jrtfs in both module jrt.fs
  3. CadenceAllegro16.6绘图软件使用一
  4. layui lay-verify 验证
  5. python12306抢票_Python 版 12306 抢票神器
  6. 如何用无监督模型,防范信用卡欺诈?
  7. 【屏类型结构体定义PanelType】 文档位置:《apiPNL.h》
  8. 反馈对于用户体验的重要性
  9. 【热门】女孩取名:女孩名字带歆什么寓意
  10. 每日一佳——Trading Convexity for Scalability(Ronan Collobert et al. ,ICML,2006)