Description


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

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

Data Constraint


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

Solution


很神奇的一道题

首先给123棋子排序,设中间棋子为p,前1、2棋子距离为d1,2、3棋子为d2,那么分类如下:
d1 < d2,根据题意可以把棋子1跳到棋子2、3中间位置
d1 = d2,我们不能把两边的棋子再往中间跳了
d1 > d2,类似地可以把棋子3跳到棋子1、2中间位置

把三种情况都视为二叉树上节点,d1=d2作为一棵二叉树的根节点,那么题意转为求树上两点最短路,进而想到lca
对于无解的情况把一个状态暴力向上跳INF找到根,比较两个根即可
对于100%的数据可以把辗转相减用相除加速,这样复杂度就是log级别的了

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define drp(i,st,ed) for (int i=st;i>=ed;--i)
#define min(x,y) ((x)<(y)?(x):(y))
const int INF=0x7777777f;
struct pos{int p,d1,d2;bool operator ==(pos b) {return b.p==p&&b.d1==d1&&b.d2==d2;}
}a,b;
int ta[3],tb[3];
int get_dep(pos now) {if (now.d1==now.d2) return 0;if (now.d1<now.d2) return (now.d2-1)/now.d1+get_dep((pos){now.p+now.d2-(now.d2-1)%now.d1,now.d1,(now.d2-1)%now.d1+1});else return (now.d1-1)/now.d2+get_dep((pos){now.p-now.d1+(now.d1-1)%now.d2,(now.d1-1)%now.d2+1,now.d2});
}
void up(pos &now,int k) {while (k) {if (now.d1==now.d2) return;if (now.d1<now.d2) {int tmp=min(k,(now.d2-1)/now.d1);k-=tmp;now=(pos){now.p+tmp*now.d1,now.d1,now.d2-tmp*now.d1};} else {int tmp=min(k,(now.d1-1)/now.d2);k-=tmp;now=(pos){now.p-tmp*now.d2,now.d1-tmp*now.d2,now.d2};}}
}
int main(void) {rep(i,0,2) scanf("%d",&ta[i]);std:: sort(ta,ta+3); a=(pos){ta[1],ta[1]-ta[0],ta[2]-ta[1]};rep(i,0,2) scanf("%d",&tb[i]);std:: sort(tb,tb+3); b=(pos){tb[1],tb[1]-tb[0],tb[2]-tb[1]};pos root_a=a; up(root_a,INF);pos root_b=b; up(root_b,INF);if (!(root_a==root_b)) {puts("NO");return 0;}int dep_a=get_dep(a);int dep_b=get_dep(b);int ans=dep_a+dep_b;if (dep_a<dep_b) {std:: swap(dep_a,dep_b); std:: swap(a,b);}up(a,dep_a-dep_b); dep_a=dep_b;drp(i,30,0) {int k=1<<i;if (k<=dep_a) {pos tmp_a=a;pos tmp_b=b;up(tmp_a,k); up(tmp_b,k);if (!(tmp_a==tmp_b)) {a=tmp_a;b=tmp_b;dep_a-=k;}}}if (!(a==b)) {up(a,1); up(b,1);}printf("YES\n%d\n",ans-2*get_dep(a));return 0;
}

bzoj2144 [2011集训队出题] 跳跳棋 倍增 lca相关推荐

  1. 【2011集训队出题】跳跳棋

    [2011集训队出题]跳跳棋 Time Limits: 1000 ms Memory Limits: 128000 KB Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点 ...

  2. P1852 跳跳棋(建模LCA)

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

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

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

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

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

  5. 洛谷P1852:跳跳棋(LCA,树形结构)

    解析 考虑一个三元组(x,y,z)(x,y,z)(x,y,z),看它能如何跳 要么是yyy往左右跳,左右边界会变大 要么是两边往中间跳,由于最多跨过一个棋子,所以左右边界会变小 当三点等距时,无法往中 ...

  6. JZOJ 1980. 【2011集训队出题】Construct

    Description 随着改革开放的深入推进-- 小T家要拆迁了-- 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于市中心,拆 ...

  7. 【2011集训队出题】拆迁队

    Description: lanxisi带领着他的拆迁队来整治一个街道.这个街道由N个旧房子组成,从左到右编号为1..N.每个旧房子i有一个正整数的美观度Ai. lanxisi希望整个街道从左到右美观 ...

  8. bzoj2144 【国家集训队2011】跳跳棋

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

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

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

最新文章

  1. Ajax (部分二:prototype.js代码)总结页面向后台传Form值、单个值和后台向前台传一个或是一组值...
  2. VS2010中的调试技巧
  3. 温故而知新 Vue 原来也有this.$forceUpdate();
  4. OpenNebula 入门安装配置
  5. indent 的格式
  6. keil用c语言怎么编辑器,用keil软件编写单片机程序的步骤
  7. Ninject依赖注入(一)
  8. Java实现文件夹打包
  9. 刚刚做了一个菜单导航变亮的效果,共享一下吧!
  10. bluetooth记录
  11. linux dstat io,linux dstat工具
  12. 【论文阅读】A Memory-Efficient Deterministic Finite Automaton-Based Bit-Split String Matching Scheme
  13. 全球与中国冲压空气涡轮行业调查与未来发展趋势研究报告
  14. 古典概型几何概型伯努利概型条件概率
  15. 《如何让你爱的人爱上你》第四部分:等价原则
  16. Android手机如何修改DPI触发平板模式
  17. 微信公众号消息通知(原生)
  18. Nacos服务---主流配置中心对比
  19. 中国移动首次明确的LTE终端频率要求
  20. Elo第四代触摸一体机发布,助力全场景数字化转型

热门文章

  1. NLP模型开发平台在舆情分析中的设计和实践
  2. Android蓝牙开发教程(二)——连接蓝牙设备
  3. 区块链(一): 以太坊基础知识
  4. 为何互联网大厂都在采用蓝绿发布、滚动发布、灰度发布?
  5. mac os 卸载java_三种方法教你在苹果Mac OS X系统中卸载软件
  6. Nginx学习笔记——上篇
  7. 解密Kotlin 1.6.20 新功能 Context Receivers
  8. oracle在哪些系统运行,Oracle运行操作系统命令
  9. 200826-C语言打印文件中的文本内容
  10. 开源点云数据处理 开源_云供应商现在正在推动开源