hdu3830(lca + 二分)
题目链接: 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 + 二分)的更多相关文章
- LCA + 二分(倍增)
两个最近的点u和v的最近的公共的祖先称为最近公共祖先(LCA).普通的LCA算法,每算一次LCA的时间复杂度为线性o(n); 这里讲LCA + 二分的方法.首先对于任意的节点v,利用其父节点的信息,可 ...
- [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组
[NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...
- noip 2015 运输计划 (lca+二分)
/* 95 最后一个点T了 qian lv ji qiong 了 没学过树剖 听chx听xzc说的神奇的方法 Orz 首先求出每个计划的路径长度 这里写的倍增 然后二分答案 对于每个ans 统计> ...
- NOIP2015运输计划(树上前缀和+LCA+二分)
Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...
- 跳跳棋[LCA+二分查找]-洛谷1852
传送门 这真是一道神仙题 虽然我猜到了这是一道LCA的题 但是... 第一遍看题,我是怎么也没想到能和树形图扯上关系 并且用上LCA 但其实其实和上一道lightoj上的那道题很类似 只不过那时一道很 ...
- BZOJ2144跳跳棋——LCA+二分
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 1388 Solved: 860 [Submit][Stat ...
- [NOIP2015]运输计划(树上差分+LCA+二分)
Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...
- [luoguP2680] 运输计划(lca + 二分 + 差分)
传送门 暴力做法 50 ~ 60 枚举删边,求最大路径长度的最小值. 其中最大路径长度运用到了lca 我们发现,求lca的过程已经不能优化了,那么看看枚举删边的过程能不能优化. 先把边按照权值排序,然 ...
随机推荐
- java:Eclipse插件springsource-tool-suite的下载和安装
1.打开下载页面http://spring.io/tools/sts/all 找到这个,后补全部版本链接http://spring.io/tools/sts/legacy 插件压缩包下载安装: 链接下 ...
- MySQL 当记录不存在时insert,当记录存在时update
MySQL当记录不存在时insert,当记录存在时更新:网上基本有三种解决方法 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句 ...
- python-编译安装Python2.7
yum中最新的也是Python 2.6.6,只能下载Python 2.7.5的源代码自己编译安装. 操作步骤如下: 1)下载并解压Python 2.7.9的源代码 cd /opt wget --no- ...
- ffmpeg混音(将多个声音合成一个)命令
ffmpeg命令中可以使用filter amix实现这个功能. 官方文档 http://ffmpeg.org/ffmpeg-filters.html 6.8 amix Mixes multiple a ...
- ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 && 快速幂)(2015沈阳网赛1002题)
Problem Description The so-called best problem solver can easily solve this problem, with his/her ch ...
- jcrop的bug
1 360(7.1.1.620,内核:31.0.1650.63)的极速模式下,出现裁剪框后,鼠标点击,页面就会滑动到底部. 查看了下源码,发现是下面的代码: function watchKeys() ...
- bzoj 4066 简单题——KDtree(带重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 带部分重构的KDtree.就是那个替罪羊树思想的. 写了对拍,调了半天,发现忘了 re ...
- VS2008中宽字节和普通字节的使用
由于麻烦,所以并没有使用宽字节,留待以后.
- web攻击之九:其它
四.身份认证和会话 [攻击] 黑客在浏览器中停用JS,防止客户端校验,从而进行某些操作. [防御] 1.隐藏敏感信息. 2.对敏感信息进行加密. 3.session 定期失效 五.权限与访问控制 [攻 ...
- 【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized
章节介绍 本章节主要学习 Java SE 1.6 中为了减少获得锁 和 释放锁 时带来的性能消耗 而引入的偏向锁 和 轻量级锁,以及锁的存储结构 和 升级过程. synchronized实现同步的基础 ...