BZOJ2144跳跳棋——LCA+二分
题目描述

写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。
输入
输出
如果无解,输出一行NO。如果可以到达,第一行输出YES,第二行输出最少步数。
样例输入
0 3 5
样例输出
2
【范围】
100% 绝对值不超过10^9
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll a,b,c;
ll x,y,z;
ll dep1,dep2;
ll root1,root2;
ll l1,l2;
ll len;
void cmp(ll &a,ll &b,ll &c)
{
if(a>b)
{
swap(a,b);
}
if(a>c)
{
swap(a,c);
}
if(b>c)
{
swap(b,c);
}
}
ll find_root(ll a,ll b,ll c,ll &dep,ll &anc)
{
ll d1=b-a;
ll d2=c-b;
while(d1!=d2)
{
if(d1<d2)
{
ll s=d2/d1;
ll t=d2%d1;
if(t==0)
{
dep+=(s-1);
anc=d1;
return a+(s-1)*d1;
}
else
{
dep+=s;
a+=s*d1;
d2=t;
}
}
else
{
ll s=d1/d2;
ll t=d1%d2;
if(t==0)
{
dep+=(s-1);
anc=d2;
return a;
}
else
{
dep+=s;
d1=t;
}
}
}
dep=0;
anc=d1;
return a;
}
void get_fa(ll &a,ll &b,ll &c,ll dep)
{
ll d1=b-a;
ll d2=c-b;
while(dep>0)
{
if(d1<d2)
{
ll s=d2/d1;
ll t=d2%d1;
if(s>=dep)
{
a+=dep*d1;
b+=dep*d1;
if(b==c)
{
b=a;
a-=d1;
}
return ;
}
else
{
dep-=s;
a+=s*d1;
b+=s*d1;
d2=t;
}
}
else
{
ll s=d1/d2;
ll t=d1%d2;
if(s>=dep)
{
c-=dep*d2;
b-=dep*d2;
if(a==b)
{
b=c;
c+=d2;
}
return ;
}
else
{
dep-=s;
b-=s*d2;
c-=s*d2;
d1=t;
}
}
}
}
int main()
{
scanf("%lld%lld%lld",&a,&b,&c);
scanf("%lld%lld%lld",&x,&y,&z);
cmp(a,b,c);
cmp(x,y,z);
l1=find_root(a,b,c,dep1,root1);
l2=find_root(x,y,z,dep2,root2);
if(l1!=l2||root1!=root2)
{
printf("NO");
return 0;
}
if(dep1<dep2)
{
len+=dep2-dep1;
get_fa(x,y,z,len);
}
else
{
len+=dep1-dep2;
get_fa(a,b,c,len);
}
ll l=0;
ll r=min(dep1,dep2);
ll ans=0;
while(l<=r)
{
ll mid=(l+r)/2;
ll a1=a,b1=b,c1=c;
ll x1=x,y1=y,z1=z;
get_fa(a1,b1,c1,mid);
get_fa(x1,y1,z1,mid);
if(a1==x1&&b1==y1&&c1==z1)
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("YES\n");
printf("%lld",len+ans*2);
}
BZOJ2144跳跳棋——LCA+二分的更多相关文章
- 跳跳棋[LCA+二分查找]-洛谷1852
传送门 这真是一道神仙题 虽然我猜到了这是一道LCA的题 但是... 第一遍看题,我是怎么也没想到能和树形图扯上关系 并且用上LCA 但其实其实和上一道lightoj上的那道题很类似 只不过那时一道很 ...
- bzoj2144: 跳跳棋(二分/倍增)
思维好题! 可以发现如果中间的点要跳到两边有两种情况,两边的点要跳到中间最多只有一种情况. 我们用一个节点表示一种状态,那么两边跳到中间的状态就是当前点的父亲,中间的点跳到两边的状态就是这个点的两个儿 ...
- bzoj2144 跳跳棋 二分
[bzoj2144]跳跳棋 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位 ...
- P1852 跳跳棋 [LCA思想+二分答案]
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有\(3\)颗棋子,分别在\(a,b,c\)这三个位置.我们要通过最少的跳动 ...
- bzoj 2144: 跳跳棋——倍增/二分
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- BZOJ2144 跳跳棋[建模+LCA]
思维题,思路比较神仙. 个人思路过程:个人只想到了只要中间棋子开始向外跳了,以后就不应该向内跳了,这样很蠢.所以应该要么先向内跳一会,要么直接开始中间的向外跳.不知道怎么处理,就卡住了. 20pts: ...
- BZOJ2144: 跳跳棋
传送门 神题一道. 考虑题目性质.首先对于一个状态,只存在四种情况,即最左/右边的点跳到中间,中间的点跳到左/右.而对于一个状态,显然第一种情况的两种分支不能同时存在,那么题目就可以理解为从$(a,b ...
- P1852 [国家集训队]跳跳棋
P1852 [国家集训队]跳跳棋 lca+二分 详细解析见题解 对于每组跳棋,我们可以用一个三元组(x,y,z)表示 我们发现,这个三元组的转移具有唯一性,收束性 也就是说,把每个三元组当成点,以转移 ...
- 跳跳棋——二分+建模LCA
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
随机推荐
- Linux 局域网同步时间
选择一台能上外网的机器作为时间服务器(都不能上亦可以,任选一台即可,但是只能保证局域网内时间同步) 配置此时间服务器 安装 ntp 在 /etc/ntp.conf 中配置 restrict 127.0 ...
- 如何学习 Webpack
webpack-howto Tip: 本文是 webpack-howto 的原文,我觉得这篇文章写得非常好,确实算是目前学习 webpack 入门的必读文章.直接收录之. 本教程的目标 这是一本教你如 ...
- Vue-条件渲染v-if与v-show
一.共同点 根据数据值来判断是否显示DOM元素 二.区别 代码: <!DOCTYPE html> <html lang="en"> <head> ...
- (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)
@翻译:huangyongye 原文链接: Understanding LSTM Networks 前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LST ...
- Linux性能评测工具之一:gprof篇
这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并把相关的资料作一个汇总,以便以后信手拈来! 1 简介 改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数 ...
- html绝对路径,相对路径
.com/eat.php中引用.com/includes/headrt.php的话写includes/header.php .com/service/eat.php中引用.com/includes/h ...
- 结对编程 学习手记ver1.2
团队成员: 226 高雅智 164刘浩然: 一 结对编程 辛辛苦苦搞了好久的时间,就是没有人家的快,明明算法都差不多,哎~~~ 结对的优势,在于双方互相督促,对于代码能贡献自己的能力,人多力量 ...
- 11.14 Daily Scrum
实现推荐菜谱时遇到问题,这个功能要和数据库和服务器有关,所以暂时放在一边,可能在beta版本实现. 部分成员已经完成基本任务,进行完善. Today's Task Tomorrow's Task ...
- 《Linux内核设计与实现》第三章读书笔记
一.进程(任务)描述 1.进程是处于执行期的程序:除了可执行程序代码,还包括打开的文件.挂起的信号.内核内部数据.一个或者多个执行线程等多种资源 线程是在进程活动中的对象:内核调度的对象是线程而不是进 ...
- 《Linux课本》读书笔记 第十七章 模块
设备与模块: 设备类型:块设备(blkdev).字符设备(cdev).网络设备: 模块: 分析hello,world模块代码.Hello_init是模块的入口点,通过module_init()注册到系 ...