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这三个位置.我们要通过最少的跳动把他们的位置移动 ...
随机推荐
- 【Luogu P1074】靶形数独
Luogu P1074 题意:给一个数独,问怎么填会使每个位置填的数乘以它的权值得到的和最大.其中每个位置的权值在题面中给出了. 思路:首先我们考虑搜索.由于我们不可能搜每个格子取太多的数,所以我们从 ...
- Luogu P2661 信息传递
传送门 一眼就能看出来是个并查集 但是并不会写... 看了一下题解说是并查集求最小环qwq 所以,每次加入第i个小同学,判断如果他要告诉的小同学k最后会告诉他(也就是转回来了), 就说明出现了一个环, ...
- 火狐浏览器 system error code 1722 rpc服务器不可用和谷歌浏览器的插件application/x-print-ladop不支持
今天要实现打印的功能,但是火狐浏览器总是出现提示:火狐浏览器 system error code 1722 rpc服务器不可用 后来发现主要是系统服务中的一个windows服务没有打开导致的. 将wi ...
- CF293B Distinct Paths 搜索
传送门 首先数据范围很假 当\(N + M - 1 > K\)的时候就无解 所以对于所有要计算的情况,\(N + M \leq 11\) 超级小是吧,考虑搜索 对于每一个格子试填一个数 对于任意 ...
- npm install xxx --save-dev 与npm install xxx --save 的区别
正常情况下: 当你为你的模块安装一个依赖模块时 1.你得先安装他们(在模块根目录下npm install module-name) 2.连同版本号手动将他们添加到模块配置文件package.json中 ...
- vim-plug 插件安装与操作
安装 vim-plug curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/juneg ...
- 基于HTML5 Canvas WebGL制作分离摩托车
工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,无数 ...
- CSS 尺寸 (Dimension) 实例
CSS 尺寸 (Dimension) 实例CSS 尺寸属性CSS 尺寸属性允许你控制元素的高度和宽度.同样,还允许你增加行间距. 属性 描述height 设置元素的高度.line-height 设置行 ...
- vue项目环境搭建
安装node.js $ npm install -g vue-cli $ vue init webpack my-project ?Project name ?Project description ...
- 第二次作业 对VC++6.0编译软件的评价
首先这个软件伴随着我们很长时间了,它是我们一上大学最先接触的,也是应用相当多的一个软件,其实在最初的时候,我对编译软件的理解非常有限,觉得它能实现一个代码的功能十分神奇的一件事情,虽然彼时我们写的代码 ...