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这三个位置.我们要通过最少的跳动把他们的位置移动 ...
随机推荐
- 《Google软件测试之道》测试开发工程师
拖延了将近半年的草稿,断断续续的写完了.之前草草翻看完这本书,关注点主要在TE上,而关于SET的部分则只是浏览,最近后知后觉,又翻出了这本书,重新看了一遍,又有新收获. 就说说Google的SET是如 ...
- php利用自定义key,对数据加解密的方法
客户端和服务端通信时,有个场景很常见,通过一个id作为url参数来回传递.假设现在业务上只有这个id标识,那么需要稍微安全一点的通信,对这个id进行加密传输,到服务端再进行解密.这里需要一个服务端进行 ...
- Maven私有仓库: 发布release版本报错:Return code is: 400, ReasonPhrase: Repository does not allow upd ating assets: maven-releases.
今天在将一个maven组件由SNAPSHORT升级为正式版本1.0.0,然后执行发布: mvn clean deploy -pl ielong-common -am -DskipTests, 报错:R ...
- 学习Angularjs向数据库添加数据
今天学习angularjs向数据库添加数据. 学习此篇,得从以往几篇开始,因为那还有创建数据表等演示. 现在来创建一个添加的存储过程: SET ANSI_NULLS ON GO SET QUOTED_ ...
- FlashWindowEx实现窗口在任务栏闪烁/变化颜色
原文:FlashWindowEx实现窗口在任务栏闪烁/变化颜色 效果类似QQ收到新的会话消息任务栏颜色变化 附2小段代码: [System.Runtime.InteropServices.DllImp ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(六)一定要RESTful吗?
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 这个问题看起来就显得有些萌,或者说类似的问题都有些不靠 ...
- 该如何以正确的姿势插入SVG Sprites?
大家好,我是苏南,今天要给大家分享的是SVG sprite(也叫雪碧图),所谓雪碧图,当然就不是我们常喝的雪碧饮料(Sprites)哦,哈哈- 当下流程的移动端,手机型号太多太多,今天工作项目中突然发 ...
- Linux下路由配置梳理
在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:---------------------------------------------------------- ...
- Hybrid APP基础篇(一)->什么是Hybrid App
最新更新 一个开源的快速混合开发框架:https://github.com/quickhybrid/quickhybrid Android.iOS.JS三端内容初步都已经完成,有完善的设计思路.教程以 ...
- Java的首次学习和了解
先来说说自己对于Java的了解.Java是一种面向对象的语言,而c++则是面向过程的.Java在网页的开发设计制作过程中必不可少,另外我们还可以用它来做手机的移动开发,还有一些基于服务器的架构设计.J ...