正题

题目链接:https://www.luogu.com.cn/problem/P1852


题目大意

一个数轴上有333个跳棋,你每次可以将一个跳棋跳到另一个跳棋对称的位置,但是不能一次跨过两个棋子。给出初始状态,和目标状态,求最小步数。

坐标的绝对值不超过10910^9109


解题思路

首先排序+差分一下记为a,b,ca,b,ca,b,c,然后四种跳法操作模拟一下发现是

  1. (a,b,c)→(a,b+c,c)(a,b,c)\rightarrow (a,b+c,c)(a,b,c)→(a,b+c,c)
  2. (a,b,c)→(a,b−c,c)(a,b,c)\rightarrow (a,b-c,c)(a,b,c)→(a,b−c,c)
  3. (a,b,c)→(a+b,b,c−b)(a,b,c)\rightarrow (a+b,b,c-b)(a,b,c)→(a+b,b,c−b)
  4. (a,b,c)→(a−b,b,c+b)(a,b,c)\rightarrow (a-b,b,c+b)(a,b,c)→(a−b,b,c+b)

然后下一步就不会了

反着考虑,能发现这些操作都是可逆的,也就是说我们可以从终点开始倒着推,或者我们可以正反着一起推,并且只保留两个操作

  • (a,b,c)→(a,b−c,c)(a,b,c)\rightarrow (a,b-c,c)(a,b,c)→(a,b−c,c)
  • (a,b,c)→(a+b,b,c−b)(a,b,c)\rightarrow (a+b,b,c-b)(a,b,c)→(a+b,b,c−b)

然后此时不难发现对于一个a,b,ca,b,ca,b,c最多只能执行以上的一个操作。

这个可以视为一个往根跳的过程,然后求两个点的路径长度,而跳的过程可以类似于gcdgcdgcd的复杂度做,因为b+cb+cb+c是一直减少的,以b+cb+cb+c代深度然后二分LCALCALCA的深度即可。

时间复杂度:O(log⁡2D)O(\log^2 D)O(log2D)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll a,b,c,A,B,C;
ll jump(ll &a,ll &b,ll &c,ll x){ll ans=0;while(b+c>x){if(b==c)return ans;if(b>c){ll k=min((b-1)/c,(b+c-x+c-1)/c);ans+=k,b-=k*c;}else{ll k=min((c-1)/b,(b+c-x+b-1)/b);ans+=k,a+=k*b,c-=k*b;}}return ans;
}
bool check(ll w){ll x=a,y=b,z=c,X=A,Y=B,Z=C;jump(x,y,z,w);jump(X,Y,Z,w);return (X==x)&&(Y==y)&&(Z==z);
}
void cp(ll &x,ll &y)
{if(x>y)swap(x,y);return;}
signed main()
{scanf("%lld%lld%lld",&a,&b,&c);cp(b,c);cp(a,b);cp(b,c);c=c-b;b=b-a;scanf("%lld%lld%lld",&A,&B,&C);cp(B,C);cp(A,B);cp(B,C);C=C-B;B=B-A;ll x=a,y=b,z=c,X=A,Y=B,Z=C;jump(x,y,z,0);jump(X,Y,Z,0);if(x!=X||y!=Y||z!=Z)return puts("NO")&0;ll l=0,r=min(b+c,B+C);while(l<=r){ll mid=(l+r)>>1;if(check(mid))l=mid+1;else r=mid-1;}x=a,y=b,z=c,X=A,Y=B,Z=C;printf("YES\n%lld\n",jump(x,y,z,r)+jump(X,Y,Z,r));return 0;
}

P1852-跳跳棋【思维,差分,二分】相关推荐

  1. P1852 跳跳棋(建模LCA)

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

  2. P1497[洛谷]P1852跳跳棋

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

  3. 洛谷1852 BZOJ2144 跳跳棋 思维题

    题目链接 题意: 坐标轴上告诉你三个互不相同的位置作为三个棋子的起点,再告诉你三个不同的位置作为三个棋子的终点,每次操作可以让一个棋子以另一个棋子为轴跳到对称位置,并且只能跳过一个棋子,问你是否能最终 ...

  4. [luogu]P1852跳跳棋

    题目重点是每次不能跳过两个棋子 即对于每一个棋子的状态(a,b,c) (a<b<c) 最多有两种移动的方式 1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b ...

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

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

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

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

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

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

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

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

  9. 跳跳棋【LCA】【二分】

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

最新文章

  1. mysql 5.7 的组复制
  2. aria-required属性学习笔记
  3. 介绍一种Fiori标准应用的增强方式
  4. MySQL笔记——DQL查询数据
  5. windows守护进程_在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)
  6. (192)FPGA上电后IO的默认状态(Vivado软件默认为1)
  7. Eclipse-无法执行现有代码,依旧执行以前的代码
  8. 【图像增强】基于matlab频域+密度分割+灰度级-彩色变换伪彩色图像增强【含Matlab源码 1011期】
  9. dnn305的一个bug
  10. 不用任何插件:小白如何白嫖百度网盘下载速度(不好用来打我,嘿嘿)
  11. 免费翻译软件哪个好用
  12. 强行进入加密QQ空间
  13. 橡胶支座抗压弹性模量计算公式_板式橡胶支座抗压弹性模量检测方法的试验研究...
  14. UESTC 1633 去年春恨却来时,落花人独立,微雨燕双飞 Dijkstra+构造
  15. 黎曼猜想--黎曼1859年《论小于某给定值的素数的个数》
  16. 1919 Problem A 二叉排序树
  17. pythonmatplotlib绘图小提琴_python 箱线图和小提琴图
  18. 2022.03全国青少年软件编程(图形化)等级考试试卷(二级)
  19. 关于'//![cdata['和 '//]]'解答
  20. 微信小程序发现的一些小问题以及解决方案集合以及注意点

热门文章

  1. 自动摘要php,修改DEDECMS文章自动摘要长度或者取掉文章摘要
  2. element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
  3. linux cpu softirq,linux softirq机制
  4. systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
  5. java高并发类_Java 高并发之魂
  6. 获取父线程 java_java子线程中获取父线程的threadLocal中的值
  7. 谁今天收到鸿蒙系统推送,鸿蒙系统正式推送,只有部分高端机才能收到
  8. php windows共享内存,关于php的共享内存的使用和研究之由起
  9. python 百度ai批量识别_Python基于百度AI的文字识别的示例
  10. 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)