Description

Little X, Little Y and Little Z are playing checkers when Little Y is annoyed. So he wants to make the chessboard much bigger. Although Little Z insists the original version, Little X stands by Little Y. After they enlarge the chessboard, the chessboard turns to an infinite line.

The chessboard is like the Number Axes now, with each integer point able to hold a checker. At initial status there are three checkers on three different integer points , and through the game there always are three checkers. Every time, they can choose a checker A to jump across a pivot checker B to a new position(but the distance between old A and B equals to new A and B, and there should be no other checkers except B in the range [old A, new A]).

After playing for a while, they wonder whether an given status a,b,c can be transferred to x,y,z. obeying the rules. Since the checkers are considered the same, it is unnecessary for a must jump to x.

Input Format

The first line is a,b,c. The second line is x,y,z. They are all integers in range (-10^9, 10^9) and the two status are valid.

Output Format

The first line is YES or NO, showing whether the transfer can be achieved. If it is YES, then output the least steps in the second line.

Sample Input

1 2 3
0 3 5

Sample Output

YES
2

一题思维好题

自己在草稿纸上手模一下;

设 a<b<c

则下一步为 2a-b a c或a c 2c-b;

若 b-a<c-b; 上一步为  b 2b-a c

若 b-a>c-b; 上一步为  a 2b-c b;

可以发现 中间点往外扩 a b c 距离增加;

反之减小;

将图画出 图是一颗二叉树!!!!;

下一步就是扩展儿子;上一步访问父亲;

那么再思考根节点问题 ;

对每个状态 它不停往上走 a b c 距离会减小;

直到 b-a=c-b;那快速找根节点只要用辗转相除就好;

那么 题目询问的第一个问题就好解决了;只要找根节点就行了;

第二个问题 ;

由于此题建图+lca麻烦而且数据也较大 空间不允许 ;那我们可以采用二分+lca

先把起始和终止状态调整到同一高度;

然后二分上升高度 往上走 判断是否相同就行了;(也要用辗转相除)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct state{int x,y,z,d;};
state st,ed;
int n,i,j,l,k,m,r;
void sor(state &now)
{
if(now.x>now.y)swap(now.x,now.y);
if(now.y>now.z)swap(now.y,now.z);
if(now.x>now.y)swap(now.x,now.y);
}
state root(state &now)
{
int q=-1,p=1,r;
state pre=now;
while(q!=p)
{
q=pre.y-pre.x;p=pre.z-pre.y;
if(p<q)
{
r=(q-1)/p;
pre.y-=r*p;
pre.z-=r*p;
}
else
{
r=(p-1)/q;
pre.x+=r*q;
pre.y+=r*q;
}
now.d+=r;
sor(pre);
}
pre.d=0;
return pre;
}
bool equr(state a,state b)
{return a.x==b.x&&a.y==b.y&&a.z==b.z ? true : false;};
state up(state now,int num)
{
int p=-1,q=1,r;
while(num&&q!=p)
{
p=now.y-now.x;q=now.z-now.y;
if(q<p)
{
r=min(num,(p-1)/q);
now.y-=q*r;
now.z-=q*r;
}
else
{
r=min(num,(q-1)/p);
now.x+=p*r;
now.y+=p*r;
}
num-=r;
sor(now);
}
return now;
}
bool check(int mid)
{
state nex1=st,nex2=ed;
nex1=up(nex1,mid+st.d-ed.d);nex2=up(nex2,mid);
if(equr(nex1,nex2))return true;
return false;
}
int main()
{
// freopen("xx.in","r",stdin);
while(scanf("%d%d%d%d%d%d",&st.x,&st.y,&st.z,&ed.x,&ed.y,&ed.z)==6)
{
sor(st);sor(ed);st.d=ed.d=0;
if(!equr(root(st),root(ed)))
printf("NO\n");
else
{
int mid,ans;
l=0;r=max(st.d,ed.d);
if(st.d<ed.d)swap(st,ed);
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))r=mid-1,ans=mid;
else l=mid+1;
}
printf("YES\n%d\n",st.d-ed.d+ans*2);
}
}
}

  

HDU 3830 Checkers(二分+lca)的更多相关文章

  1. HDU 3830 Checkers

    意甲冠军: 有三件  所有其他棋子可以跳  不能分开的两个跳跃  当被问及状态u为了国家v最低短跳转 思路: 对于一个状态三个棋子的位置能够设为 x y z  (小到大) 仅仅有当y-x=z-y的时候 ...

  2. NOIP2015 运输计划(二分+LCA+差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status] ...

  3. UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)

    UVA 题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径: 思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因 ...

  4. HDU 4822 Tri-war(LCA树上倍增)(2013 Asia Regional Changchun)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4822 Problem Description Three countries, Red, Yellow ...

  5. hdu 2413(最大匹配+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413 思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战 ...

  6. HDU 5884 Sort (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...

  7. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281   Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘, ...

  8. HDU 3966 dfs序+LCA+树状数组

    题目意思很明白: 给你一棵有n个节点的树,对树有下列操作: I c1 c2 k 意思是把从c1节点到c2节点路径上的点权值加上k D c1 c2 k 意思是把从c1节点到c2节点路径上的点权值减去k ...

  9. hdu3830 (二分+LCA)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Checkers Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. 【Oracle】RMAN备份

    1. 完全备份 RMAN> backup as backupset database; Starting allocated channel: ORA_DISK_1 channel ORA_DI ...

  2. BOW模型在ANN框架下的解释

    原文链接:http://blog.csdn.net/jwh_bupt/article/details/17540561 作者的视野好,赞一个. 哥德尔第一完备性定理,始终是没有能看完完整的证明,艹!看 ...

  3. nutz 自定义sql的使用

    虽然提供了Cnd,但是用起来是觉得有点不方便,然后就直接编写Sql语句.nutz提供了一些方法. Nutz.Dao 的自定义 SQL 部分的解决方案是: // 不推荐使用 用户可以硬编码 SQL 语句 ...

  4. C# 解析 j s 三元运算符

    private void button1_Click(object sender, EventArgs e) { //转换 string str1 = "表达式1?表达式2:表达式3&quo ...

  5. 何使用ultraiso软碟通制作u盘启动盘(转载)

        现在很多网友都不知道如何用UltraISO软件来制作制作u盘启动盘,那么今天U大师小编就来给大家简单的介绍两种方法,首先第一种方法就是网友要到网上下载一个UltraISO软件,这个网上有很多的 ...

  6. Centos7安装keepalived(自定义路径安装)-高级篇

    0.Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker.但 ...

  7. Python之Mail编程

    # Mail编程- 管理程序 - Euroda使邮件普及 - Netscape,outlook,forxmail后来居上 - Hotmail使用浏览器发送邮件 ## 邮件工作流程- MUA邮件用户代理 ...

  8. Django入门--自定义过滤器与标签

    ---恢复内容开始--- 为了让Django找到自定义的模板过滤器和模板标签,需要进行文件路径配置,配置方式分为APP目录下配置和项目路径下配置两种方式: 1.在APP目录下配置:针对某个应用特定的自 ...

  9. 《黑白团团队》第八次团队作业:Alpha冲刺 第四天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第四天 日期:2019/6/18 成员 ...

  10. uni-app 之验证码

    手机APP---验证码 最近公司在开发手机APP,app避不可免的就是登录了,emmmm 登录验证码那必须的是有的,我们公司发给我们的图片是酱紫的~~ 这个要求大家应该都能看懂,做这个手机号啊,验证码 ...