P1852-跳跳棋【思维,差分,二分】
正题
题目链接:https://www.luogu.com.cn/problem/P1852
题目大意
一个数轴上有333个跳棋,你每次可以将一个跳棋跳到另一个跳棋对称的位置,但是不能一次跨过两个棋子。给出初始状态,和目标状态,求最小步数。
坐标的绝对值不超过10910^9109
解题思路
首先排序+差分一下记为a,b,ca,b,ca,b,c,然后四种跳法操作模拟一下发现是
- (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−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,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(log2D)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-跳跳棋【思维,差分,二分】相关推荐
- P1852 跳跳棋(建模LCA)
P1852 跳跳棋(建模&LCA) 往外跳有个两个状态,往里跳只能有一个唯一父亲状态. 所以是一个二叉树. 将给定的起始和目标状态 向上找到根,判断是否相等.不相等无解. 否则类似求LCA的思 ...
- P1497[洛谷]P1852跳跳棋
P1497[洛谷]P1852跳跳棋 标签(空格分隔): 信息 图论 二分 洛谷 考题,看到就觉得是不可能写出来的那种,于是打了个bfs直接走人. 考完之后听吕大佬讲过之后觉得此题可谓绝妙啊%%% 屁颠 ...
- 洛谷1852 BZOJ2144 跳跳棋 思维题
题目链接 题意: 坐标轴上告诉你三个互不相同的位置作为三个棋子的起点,再告诉你三个不同的位置作为三个棋子的终点,每次操作可以让一个棋子以另一个棋子为轴跳到对称位置,并且只能跳过一个棋子,问你是否能最终 ...
- [luogu]P1852跳跳棋
题目重点是每次不能跳过两个棋子 即对于每一个棋子的状态(a,b,c) (a<b<c) 最多有两种移动的方式 1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b ...
- BZOJ2144跳跳棋——LCA+二分
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...
- BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)
跳跳棋 问题描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位 ...
- 跳跳棋(国家集训队,LCA,洛谷P1852,BZOJ[2144])
文章目录 题目 思路 代码 题目 题目链接 描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有333颗棋子,分别在a,b,ca,b ...
- 跳跳棋【LCA】【二分】
>Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少 ...
最新文章
- mysql 5.7 的组复制
- aria-required属性学习笔记
- 介绍一种Fiori标准应用的增强方式
- MySQL笔记——DQL查询数据
- windows守护进程_在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)
- (192)FPGA上电后IO的默认状态(Vivado软件默认为1)
- Eclipse-无法执行现有代码,依旧执行以前的代码
- 【图像增强】基于matlab频域+密度分割+灰度级-彩色变换伪彩色图像增强【含Matlab源码 1011期】
- dnn305的一个bug
- 不用任何插件:小白如何白嫖百度网盘下载速度(不好用来打我,嘿嘿)
- 免费翻译软件哪个好用
- 强行进入加密QQ空间
- 橡胶支座抗压弹性模量计算公式_板式橡胶支座抗压弹性模量检测方法的试验研究...
- UESTC 1633 去年春恨却来时,落花人独立,微雨燕双飞 Dijkstra+构造
- 黎曼猜想--黎曼1859年《论小于某给定值的素数的个数》
- 1919 Problem A	二叉排序树
- pythonmatplotlib绘图小提琴_python 箱线图和小提琴图
- 2022.03全国青少年软件编程(图形化)等级考试试卷(二级)
- 关于'//![cdata['和 '//]]'解答
- 微信小程序发现的一些小问题以及解决方案集合以及注意点
热门文章
- 自动摘要php,修改DEDECMS文章自动摘要长度或者取掉文章摘要
- element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
- linux cpu softirq,linux softirq机制
- systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
- java高并发类_Java 高并发之魂
- 获取父线程 java_java子线程中获取父线程的threadLocal中的值
- 谁今天收到鸿蒙系统推送,鸿蒙系统正式推送,只有部分高端机才能收到
- php windows共享内存,关于php的共享内存的使用和研究之由起
- python 百度ai批量识别_Python基于百度AI的文字识别的示例
- 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)