题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3830

题意: 有三个点 a, b, c, 对于其中任意一点 x 可以跨过一个点移动到另一个位置, 当且仅当移动前后的 x 与其所跨越的点的距离相等 .给出两组点, 问其能否相互到达, 若能并输出最少需要移动多少步 .

思路: http://www.cnblogs.com/scau20110726/archive/2013/06/14/3135024.html

代码:

 #include <iostream>
#include <stdio.h>
#include <algorithm>
#define ll long long
using namespace std; struct node{
ll x, y, z, d;
}; void f(node &s){
ll cnt[];
cnt[] = s.x;
cnt[] = s.y;
cnt[] = s.z;
sort(cnt, cnt + );
s.x = cnt[];
s.y = cnt[];
s.z = cnt[];
} bool equal(node a, node b){//判断两个节点是否想等
if(a.x == b.x && a.y == b.y && a.z == b.z) return true;
return false;
} node get_root(node &root){//这里要记录一下深度
ll r;
node cnt = root;
ll p = cnt.y - cnt.x;
ll q = cnt.z - cnt.y;
while(p != q){
if(q > p){ //右边大于左边
r = (q - ) / p;
cnt.x += r * p;
cnt.y += r * p;
}else{
r = (p - ) / q;
cnt.z -= r * q;
cnt.y -= r * q;
}
root.d += r;
f(cnt); //注意每个节点都要维护
p = cnt.y - cnt.x;
q = cnt.z - cnt.y;
}
return cnt;
} node get_pre(node cnt, ll step){ //返回cnt向上移动step步后到达的位置
ll p, q, r;
while(step > ){
p = cnt.y - cnt.x;
q = cnt.z - cnt.y;
if(q > p){
r = (q - ) / p;
if(r > step) r = step;//注意剩余步数不足的情况
cnt.x += r * p;
cnt.y += r * p;
}else{
r = (p - ) / q;
if(r > step) r = step;
cnt.z -= r * q;
cnt.y -= r * q;
}
step -= r;
f(cnt);
}
return cnt;
} ll solve(node s, node e){
ll l = , r = s.d < e.d ? s.d : e.d;
ll cnt = r;
while(l <= r){
ll mid = (l + r) >> ;
ll gg = cnt - mid;// mid 为 lca 位置, gg 为移动步数
if(equal(get_pre(s, gg), get_pre(e, gg))) l = mid + ;
else r = mid - ;
}
return ((cnt - (l - )) << );// l - 1 为lca位置
} int main(void){
node s, e;
while(~scanf("%lld%lld%lld%lld%lld%lld", &s.x, &s.y, &s.z, &e.x, &e.y, &e.z)){
s.d = e.d = ;
f(s);
f(e);
if(!equal(get_root(s), get_root(e))){ //根节点不同无法到达
puts("NO");
continue;
}
ll d = abs(s.d - e.d);
if(s.d > e.d) s = get_pre(s, d); //使两者处于同一深度
else e = get_pre(e, d);
int sol = solve(s, e);
puts("YES");
printf("%lld\n", d + sol);
}
return ;
}

hdu3830(lca + 二分)的更多相关文章

  1. LCA + 二分(倍增)

    两个最近的点u和v的最近的公共的祖先称为最近公共祖先(LCA).普通的LCA算法,每算一次LCA的时间复杂度为线性o(n); 这里讲LCA + 二分的方法.首先对于任意的节点v,利用其父节点的信息,可 ...

  2. [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组

    [NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...

  3. noip 2015 运输计划 (lca+二分)

    /* 95 最后一个点T了 qian lv ji qiong 了 没学过树剖 听chx听xzc说的神奇的方法 Orz 首先求出每个计划的路径长度 这里写的倍增 然后二分答案 对于每个ans 统计> ...

  4. NOIP2015运输计划(树上前缀和+LCA+二分)

    Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...

  5. 跳跳棋[LCA+二分查找]-洛谷1852

    传送门 这真是一道神仙题 虽然我猜到了这是一道LCA的题 但是... 第一遍看题,我是怎么也没想到能和树形图扯上关系 并且用上LCA 但其实其实和上一道lightoj上的那道题很类似 只不过那时一道很 ...

  6. BZOJ2144跳跳棋——LCA+二分

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  7. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  8. [NOIP2015]运输计划(树上差分+LCA+二分)

    Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...

  9. [luoguP2680] 运输计划(lca + 二分 + 差分)

    传送门 暴力做法 50 ~ 60 枚举删边,求最大路径长度的最小值. 其中最大路径长度运用到了lca 我们发现,求lca的过程已经不能优化了,那么看看枚举删边的过程能不能优化. 先把边按照权值排序,然 ...

随机推荐

  1. 高并发下用pdo,文件排它锁,redis三种方法对比

    <?php header('content-type:text/html;charset=utf-8');                 // //无控制     // $DB_DSN = ' ...

  2. HTML5调用百度地图API进行地理定位实例

    自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图AP ...

  3. C#实现文件拖放并打开文件(使用ListBox)

    1.C#实现文件拖放并打开文件 (http://www.cnblogs.com/GaoHuhu/archive/2012/10/10/2717954.html)

  4. User-Agent 及其构造

    url = ... user_agent = ... headers = {'User-Agent' : user_agent} req = requests.request(url=url, hea ...

  5. C++ 0X 新特性实例(比较常用的) (转)

    转自:http://www.cnblogs.com/mrblue/p/3141456.html //array #include <array> void Foo1() { array&l ...

  6. Skype SILK codec overview

    最近简单看了一下Skype SILK codec 算法, 基本原理和流程大体明白了, 以后有时间再仔细研究一下细节,今天就简单说说. SILK Codec是一个语音和音频编解码算法, 对于音频带宽.网 ...

  7. ACM学习历程—HDU 5459 Jesus Is Here(递推)(2015沈阳网赛1010题)

    Sample Input 9 5 6 7 8 113 1205 199312 199401 201314 Sample Output Case #1: 5 Case #2: 16 Case #3: 8 ...

  8. ACM学习历程—FZU2195 检查站点(树形DP || 贪心)

    Description 在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检查,各个站点间有且仅有一条通路,检查员下山前往站点时比较轻松,而上山时却需要额外的时间,问最后检查员检查完所有站点 ...

  9. 记一次肉机事件--yam

    背景: 研发同事反应他自己的测试机器,有一个yum程序占用cpu很多,接近100%,然后他就将这个程序kill了.我一看他给我发的截图,原来不是“yum”,而是“yam”,第一反应就是让人当肉机了.上 ...

  10. JVM体系结构之二:类加载器之2:JVM 自定义的类加载器的实现和使用

    一.回顾一下jdk自带的类加载器: 1.java虚拟机自带的加载器     根类加载器(Bootstrap,c++实现)     扩展类加载器(Extension,java实现)     应用类加载器 ...