思维好题!

  可以发现如果中间的点要跳到两边有两种情况,两边的点要跳到中间最多只有一种情况。

  我们用一个节点表示一种状态,那么两边跳到中间的状态就是当前点的父亲,中间的点跳到两边的状态就是这个点的两个儿子,从而组成一棵二叉树。

  于是两个状态能够达到当且仅当他们在同一棵树上,只要看看根节点是否一样就好了。

  那怎么求两个状态的最短距离呢?我们考虑两边的点跳到中间实际上是一个更相相损的过程,于是我们像gcd一样做就可以优化成log级别的了。求两个状态的最短距离实际上就是求两个节点在树上的距离,像倍增求lca一样,先跳到一样的高度,然后二分一下高度,找到LCA算就好了。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=500010,inf=1e9;
struct poi{int x,y,z;}a,b,x,y;
int high,len,lena,lenb;
inline void read(int &k)
{int f=1;k=0;char c=getchar();while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();k*=f;
}
poi climb(poi now,int time)
{for(len=0;time;len+=high){int l=now.y-now.x,r=now.z-now.y;if(l==r)return now;if(l<r)high=min((r-1)/l,time),time-=high,now.x+=l*high,now.y+=l*high;else high=min((l-1)/r,time),time-=high,now.y-=r*high,now.z-=r*high;}return now;
}
void sort(poi &now)
{if(now.x>now.y)swap(now.x,now.y);if(now.x>now.z)swap(now.x,now.z);if(now.y>now.z)swap(now.y,now.z);
}
int main()
{read(a.x);read(a.y);read(a.z);read(b.x);read(b.y);read(b.z);sort(a);sort(b);x=climb(a,inf);lena=len;y=climb(b,inf);lenb=len;if(x.x!=y.x||x.y!=y.y||x.z!=y.z)return puts("NO"),0;puts("YES");if(lena<lenb)swap(a,b),swap(lena,lenb);a=climb(a,lena-lenb);int l=0,r=lenb;while(l<r){int mid=(l+r)>>1;x=climb(a,mid);y=climb(b,mid);if(x.x==y.x&&x.y==y.y&&x.z==y.z)r=mid;else l=mid+1;}printf("%d",(l<<1)+lena-lenb);
}

View Code

转载于:https://www.cnblogs.com/Sakits/p/7622439.html

bzoj2144: 跳跳棋(二分/倍增)相关推荐

  1. [BZOJ2144]跳跳棋

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

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

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

  3. bzoj2144 跳跳棋

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

  4. bzoj-2144 跳跳棋

    2144: 跳跳棋 题目链接 时间限制: 10 Sec 内存限制: 259 MB 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一 个简单的游戏: ...

  5. [bzoj2144]: 跳跳棋

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 689  Solved: 326 [Submit][Status][Discuss ...

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

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

  7. BZOJ2144: 跳跳棋

    求三个人从a,b,c这三个位置跳到x,y,z最少多少步.跳:任意选一颗棋子,对一颗中轴棋子跳动.跳动后两颗棋子距离不变.一次只允许跳过1颗棋子.  从它跳的性质出发,向内跳只有一种操作,而向外跳有两种 ...

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

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

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

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

最新文章

  1. pyinstaller 打包tensorflow2.0为单个文件
  2. Fastjson 1.2.66 版本发布,继续加固安全!
  3. Creo二次开发--内存清理函数
  4. bzoj 2296: 【POJ Challenge】随机种子
  5. 使用VS2008在windows平台上试用Kinect
  6. 字体大宝库:40款为网页设计师准备的时尚字体【上篇】
  7. IT计算机实习:JAVA实习报告范文(一)
  8. 《SDN核心技术剖析和实战指南》
  9. C语言半框,如何挑选适合自己的镜框(镜片)?
  10. 轻量级Kubernetes之k3s:15:firewalld对应方法
  11. iOS录屏直播(二)Broadcast Upload Extension和Broadcast Setup UI Extension
  12. 【悟空云课堂】第三十九期:违反信任边界(CWE-501: Trust Boundary Violation)
  13. Medusa(美杜莎)和Hydra(九头蛇)快速入门手册:02
  14. 云栖重磅!阿里云启动视频云V5计划,全面赋能生态合作伙伴
  15. 读书笔记--Java虚拟机垃圾收集算法
  16. python编写木马攻击_python实现一个简单木马!
  17. 永磁同步电机矢量控制仿真——如何绘制电机输出的磁链
  18. 使用Python实现SYN 泛洪攻击(SYN Flood)
  19. java毕业设计校园新闻网站(附源码、数据库)
  20. 截图密报Windows 8 Beta测试版windows8测试版主

热门文章

  1. chrome 浏览器全屏操作
  2. 混合使用Azure LB和ILB访问相同web服务(3)
  3. Redis,MemCached,MongoDB 概述
  4. 用Maven管理JavaScript资源
  5. 只不过是R.java文件的特性-----出错信息:R.java was modified manually! Reverting to generated version!...
  6. python3支持中文_彻底颓了—— Vim Python 3 接口不支持中文 - Jacky Liu's Blog
  7. Gtest在vs 2010上的配置
  8. UliPad 初体验----python 开发利器
  9. Ubuntu下安装Oracle11g(图文教程)
  10. 小肚皮最新版本_小肚皮旧版本