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这三个位置.我们要通过最少的跳动把他们的位置移动 ...
随机推荐
- lesson 4:凯撒密码问题
一·问题描述 二·解决过程 1.设计思路 ①人机交互界面 ②加密函数(将字符串的每一个字符提取出来,通过对字符的阿斯克码值进行运算操作实现加密过程,特殊的特殊对待) ③解密函数(与加密函数算法类似) ...
- timeout可以实现当一个命令在规定时间内不返回就强制返回的功能 + 杀毒安装ClamAV nmap 速度 比Telnet 快
[root@xiaowei ~]# cat telnetport.sh #!/bin/bash Port=25223 timeout 2 ssh root@127.0.0.1 "telnet ...
- proxy config (firefox config)
sudo apt-get install shadowsocks sudo apt-get install polipo 编辑polipo config: sudo vim /etc/polipo/c ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)
“传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...
- c# WPF 设置窗口一直在其中窗口后面/底层窗口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- .NET Core在类库中读取配置文件appsettings.json
在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...
- .Net版本依赖之坑引发的搜查
前言 今天上午,一个客户反馈XX消息没有推送到第三方链接.于是我查看了推送日志列表,并没有今天的.接着登录服务器查询文件日志,看到了记录.我们的代码步骤是消息先推送到消息队列,消费消息队列时,记录文件 ...
- OpenTracing:开放式分布式追踪规范
前言 想实现一个简单的追踪系统似乎是容易的,需要必要的调用链id,时间戳等:想实现一款易用不侵入代码的追踪系统就很麻烦了,需要接触CLR和IL相关知识:即使你费劲心力做出了那些,如果性能不够好,也没有 ...
- KVM虚拟机管理——资源调整
1. 概述2. 计算资源调整2.1 调整处理器配置2.2 调整内存配置3. 存储资源调整3.1 根分区扩展3.2 添加磁盘4. 网络资源调整 1. 概述 KVM在使用过程中,会涉及到计算(CPU,内存 ...
- WordPress更新时提示无法连接到FTP服务器的解决方案
这几天在搭建主站的时候,更新wordpress时无法连接到FTP原因服务器 解决方法如下: 在WordPress目录下找到wp-config.php文件并编辑,在最后一行加上: define('FS_ ...