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这三个位置.我们要通过最少的跳动把他们的位置移动 ...
随机推荐
- ueditor保存出现 从客户端(Note="<p>12345</p>")中检测到有潜在危险的 Request.Form 值
检测到有潜在危险的 Request.Form 值 这种问题是因为你提交的Form中有HTML字符串,例如你在TextBox中输入了html标签,或者在页面中使用了HtmlEditor组件等,解决办 ...
- 外部Jenkins调用容器中Slave配置实践
1.Jenkins配置 实现动态生成的Slave节点并调用,解决构建项目出现slave节点任务堵塞或者是slave宕机问题.容器平台采用openshift. 参考配置文档:https://blog.c ...
- React-Route的属性exact
exact是Route下的一条属性,一般而言,react路由会匹配所有匹配到的路由组价,exact能够使得路由的匹配更严格一些. exact的值为bool型,为true是表示严格匹配,为false时为 ...
- 在线图标制作,格式转换 ICON
在线图标制作,格式转换 https://www.easyicon.net/covert/
- C#基础巩固(3)-Linq To XML 读取XML
记录下一些读取XML的方法,以免到用的时候忘记了,还得花时间去找. 一.传统写法读取XML 现在我有一个XML文件如下: 现在我要查找名字为"王五"的这个人的 Id 和sex(性别 ...
- 调用不同目录类的protected构造器
一.问题 二.分析 调用不同目录类的protected构造器,IDE报错. 二.解决办法: 后面添加一个{}就可以了
- 并行编程(Parallel Framework)
前言 并行编程:通过编码方式利用多核或多处理器称为并行编程,多线程概念的一个子集. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.多线程的一种. 并行编程分为如下几个结构: 1 ...
- SKINNY加密算法详解(无代码,仅加密)
原作者论文请参考<The SKINNY Family of Block Ciphers and Its Low-Latency Variant MANTIS> 地址为:https://li ...
- 利用Tarjan算法解决(LCA)二叉搜索树的最近公共祖先问题——数据结构
相关知识:(来自百度百科) LCA(Least Common Ancestors) 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 例如: 1和7的最近公共祖先为5: 1和5的 ...
- Record for Individual Project ( Word frequency program )
1. 预计时间 ● 对问题总体的理解.规划:10 min ● 设计编写程序:5 h ● 调试: 分模块-40 min; 总体-40min ● 测试(性能分析).改进:1 h 2. 实际用时 ● 对 ...