题目链接: 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. 计算地球上两个坐标点(经度,纬度)之间距离sql函数

    go --计算地球上两个坐标点(经度,纬度)之间距离sql函数 --作者:lordbaby --整理:www.aspbc.com CREATE FUNCTION [dbo].[fnGetDistanc ...

  2. javascript笔记(二)

    concat() 连接多个字符串,返回合并后的字符串. 1 var s1="a"; 2 var s2="b"; 3 var s3="c"; ...

  3. phpunit手动配置

    phpunit: #!D:\xampp\php\.\php.exe<?php/* PHPUnit * * Copyright (c) 2001-2013, Sebastian Bergmann ...

  4. ACM学习历程—ZOJ3785 What day is that day?(数论)

    Description It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are ...

  5. pytorch 调用forward 的具体流程

    forward方法的具体流程: 以一个Module为例:1. 调用module的call方法2. module的call里面调用module的forward方法3. forward里面如果碰到Modu ...

  6. BZOJ2288:[POJ Challenge]生日礼物

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  7. MySQL5.7出现Your password has expired. To log in you must change it using a client that supports expir

    今天晚上本来想写bootstrap-fileinput插件集成fastdfs的文章,但是刚启动idea里面的QiYuAdmin就出现了错误: Your password has expired. To ...

  8. virtual judge(专题一 简单搜索 E)

    Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose ...

  9. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  10. 第 五 课 golang语言变量

    1 变量三种声明: (第一种的var和类型都是多余: 第二种最简洁,但是第二种只能用在函数中,不能是全局变量的声明)        第一种: var v_name v_type(注意顺序) v_nam ...