题目链接: 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. Delphi Stringlist Delimiter如何区分TAB和空格

    var st: TStrings; begin st := TStringList.Create; st.StrictDelimiter := True;//这个多少人用过? st.Delimiter ...

  2. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

  3. hdu 4514 湫湫系列故事――设计风景线(求树的直径)

    随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.  现在已经勘探确定了n个位置 ...

  4. linux-常用指令1

    掌握下面的命令是最基本的噢!那是我们使用一个系统最基本的操作. 玩过dos么,其实,linux下的文件操作和dos差不多.没什么难的,多练习就记住了.下面如果有条件的话请跟我一样操作吧!百看不如一做. ...

  5. C/C++ 安全编码 —— 不安全的函数

    1. 文件与IO操作 gets():从控制台输入到字符数组: char response[8]; gets(response); 如果控制台输入超过 8 个字符,程序便会发生不确定的行为.其主要问题在 ...

  6. pandas 学习 —— pivot table

    0. DataFrame 的 index.columns.values >> df = pd.DataFrame(np.arange(6).reshape(3, 2), index=['o ...

  7. 白话算法(6) 散列表(Hash Table)从理论到实用(中)

    不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好的)方法.推动科技进步的人,永远是那些敢于问出比外行更天真.更外行的问题, ...

  8. BZOJ1636&&1699:[USACO2007JAN]Balanced Lineup

    浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...

  9. git rebase小计(转)

    git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新定义分支的版本库状态.要搞清楚这个东西,要先看看版本库状态切换的两种情况: 我们知道,在某个分支上,我们可以通过git ...

  10. jquery 中post 、get的同步问题,从外部获取返回数据

    解决方法1: 在全局设置: $.ajaxSetup({ async : false }); $.ajaxSetup({ async : false }); 然后再使用post或get方法 $.get( ...