【2011集训队出题】跳跳棋

Time Limits: 1000 ms Memory Limits: 128000 KB

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

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

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

1 2 3
0 3 5

Sample Output

YES
2

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


大意如题。

啊?一看就蒙了,不会做啊。果断上暴力

于是最后发现自己是个傻子:在中间的点往两边条,两边的点往中间跳,为互逆操作,看做一条边。所以就是求两个状态的最短路径咯!!

继续剖析这个图,假设三个点中间的那个往左跳到左儿子,往右跳到右儿子,根为三点等距,求两状态的lca!!倍增——怎么搞啊,树都不会建。。。诶?跳跃过程中两点的相对距离不改变——利用这个倍增就好了。

#include<cstring>
#include<cstdio>
#define ll long longusing namespace std;ll a,b,c,x,y,z;void swap(ll &a,ll &b){a^=b;b^=a;a^=b;}ll floor(ll s,ll s1,ll s2){ll ret=0;for(;;){if(s1%s2==0)return ret+s1/s2-1;if(s2%s1==0)return ret+s2/s1-1;if(s1>s2)ret+=s1/s2,s1%=s2;else ret+=s2/s1,s2%=s1;}
}
void climb(ll &s,ll &s1,ll &s2,ll fl){if(fl==0)return;for(;;){if(s1==s2 && fl>0)return;if(s1>s2){if(s1-fl*s2>0){s1-=fl*s2;return;}else{fl-=(s1-1)/s2;s1-=(s1-1)/s2*s2;}}else if(s2>s1){if(s2-fl*s1>0){s+=fl*s1;s2-=fl*s1;return;}else{fl-=(s2-1)/s1;s+=(s2-1)/s1*s1;s2-=(s2-1)/s1*s1;}}else break;}
}
bool com(ll s,ll s1,ll s2,ll f1,ll t,ll t1,ll t2,ll f2){climb(s,s1,s2,f1);climb(t,t1,t2,f2);if(s!=t || s1!=t1 || s2!=t2)return 0;return 1;
}
ll go(ll s,ll s1,ll s2,ll t,ll t1,ll t2){ll f1=floor(s,s1,s2),f2=floor(t,t1,t2),ret=0;if(!com(s,s1,s2,f1,t,t1,t2,f2))return -1;if(f1<f2)ret+=f2-f1,climb(t,t1,t2,f2-f1);elseif(f2<f1)ret+=f1-f2,climb(s,s1,s2,f1-f2);if(com(s,s1,s2,0,t,t1,t2,0))return ret;for(int i=30;i>=0;i--){if(f1>=1<<i && f2>=1<<i && !com(s,s1,s2,1<<i,t,t1,t2,1<<i)){climb(s,s1,s2,1<<i),climb(t,t1,t2,1<<i);ret+=1<<i;ret+=1<<i;f1-=1<<i;f2-=1<<i;}}return ret+2;
}int main(){scanf("%lld %lld %lld",&a,&b,&c);scanf("%lld %lld %lld",&x,&y,&z);if(a>b)swap(a,b);if(b>c)swap(b,c);if(a>b)swap(a,b);if(x>y)swap(x,y);if(y>z)swap(y,z);if(x>y)swap(x,y);ll st=go(a,b-a,c-b,x,y-x,z-y);if(st==-1)printf("NO");else printf("YES\n%lld",st);
}

【2011集训队出题】跳跳棋相关推荐

  1. bzoj2144 [2011集训队出题] 跳跳棋 倍增 lca

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. pandas 按日期范围筛选数据的实现
  2. QCon上海2015十大热点
  3. 2016-2017 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2016)
  4. js函数中参数的传递
  5. 价值100大洋的简体中文汉化补丁下载
  6. datatable刷新数据_UE4 利用SaveGame和CSV进行Runtime数据更新
  7. C#中实现拖拽功能,补全中
  8. java countdowntimer_(六)Android中使用CountDownTimer实现倒计时功能
  9. 使用jsoup爬虫超时分析与处理
  10. 免费的虚幻3引擎其实不好用啊
  11. CentOS安全运维检查命令
  12. 外贸找客户软件:Email Extractor Pro
  13. excel单元格内容拆分_Excel | 单元格内容换行方法
  14. springboot+vue+element-ui下载excel模板(静态文件)
  15. java红牛农场,在新加坡的,完一朋友一个夜班喝5瓶红牛。 下班坐地
  16. 一首同音叠字诗“石室诗士施氏”
  17. 设置字段默认值Java_小书MybatisPlus第9篇-常用字段默认值自动填充
  18. 【编程题】【Scratch三级】2019.09 打气球游戏
  19. Ubuntu 18.04/20.04 多线程下载工具AXEL和AIRA2
  20. Google面试题 图论的问题

热门文章

  1. 强化学习经典应用环境-Atari 2600游戏合集
  2. 随笔记:PPT渐变色
  3. icp许可证怎么申请
  4. 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
  5. CSS 让元素内子元素翻转排序
  6. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例...
  7. 470余万条疑似12306用户数据遭贩卖 嫌疑人被刑拘
  8. a4纸在html的像素,打印常识:A4纸张在显示器上应该要多少像素?
  9. oracle根据关键字搜索存储过程
  10. (C语言)图书管理系统(程序设计)