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. 国外60个专业3D模型网站

    原始链接:http://blog.sina.com.cn/s/blog_4ba3c7950100jxkh.html Today, 3D models are used in a wide variet ...

  2. java类型和mysql类型的转换

    Integer  -----> int 11String     ----->  varchar 20Long       -----> bigint 20String      - ...

  3. scrapy 动态网页处理——爬取鼠绘海贼王最新漫画

    简介 scrapy是基于python的爬虫框架,易于学习与使用.本篇文章主要介绍如何使用scrapy爬取鼠绘漫画网海贼王最新一集的漫画. 源码参见:https://github.com/liudaol ...

  4. python编写简单的html登陆页面(4)

    python编写简单的html登陆页面(4)   1  在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将动态态分配数据,建立表格,存放学生信息 2 实现的效果如下: 3  动 ...

  5. 快速搭建一个本地的FTP服务器 win10及win7

    快速搭建一个本地的FTP服务器   如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试. (win10) 第一步:配置IIS Web服务器 1.1 控制面板中找到“ ...

  6. php 的多进程

    php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理 例子1: <?php $pid = pcntl_fork(); if($pid == -1) { //错 ...

  7. 【airtest】iOS,Android 依托 jenkins 并行跑

    Airtest 只支持一台mac 连接一台iPhone,  以下方法是以“一台mac 连接一台iPhone”为基础,依托jenkins 统一管理多台iPhone. [mac] jenkins mast ...

  8. 51nod-活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?分析: 我们就是想提高教室地利用率,尽可能多地安排活动.考虑容易想到的几种贪心策略: (1 ...

  9. nyoj11-奇偶数分离

    奇偶数分离 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 有一个整型偶数n(2<= n <=10000),你要做的是:先把1到n中的所有奇数从小到大输出,再 ...

  10. django与mysql实现简单的增删查改

    模型定义 from django.db import models class Grades(models.Model): g_name = models.CharField(max_length=2 ...