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的过程已经不能优化了,那么看看枚举删边的过程能不能优化. 先把边按照权值排序,然 ...
随机推荐
- UTF-8 delphi 函数
unit util_utf8; interface uses Windows; type UTF8String = AnsiString; function AnsiT ...
- 序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})
package com.dsj.gdbd.utils.serialize; import java.io.ByteArrayInputStream; import java.io.ByteArrayO ...
- python 特征选择 绘图 + mine
demo代码: # _*_coding:UTF-8_*_ import numpy as np import sys import pandas as pd from pandas import Se ...
- IDT 数据预览查询
前面做了一件非常愚蠢的事情,由于不会预览数据.我都是直接发布到webi去查看的.可以想象一下了.真是太年轻了.为自己感到十分的汗颜. 在数据基础层做好连接之后,可以查看数据基础 .会显示相应的join ...
- 如何查看myeclipse是否激活
myEclipse---->Subscription information--->Subscription expiration date 看这个日期到什么时候!另外建议别用太高版本的M ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- 检测 iOS 的 APP 性能的一些方法
本文转载于微信公众号:iOS大全 首先如果遇到应用卡顿或者因为内存占用过多时一般使用Instruments里的来进行检测.但对于复杂情况可能就需要用到子线程监控主线程的方式来了,下面我对这些方法做些介 ...
- CF1092 D & E —— 思路+单调栈,树的直径
题目:https://codeforces.com/contest/1092/problem/D1 https://codeforces.com/contest/1092/problem/D2 htt ...
- for循环中的条件执行循序
问题: public class Main { public static void main(String[] args) { int i,n,length = 0; for(i=1;length& ...
- 上海-北京间通过Azure Storage的RA-GRS类型的存储账户进行快速复制
Azure的Blob存储分成多种类型,目前主要有: 其中RA-GRS可以在上海-北京两个数据中心间同步数据.并且,在第二个数据中心可以只读的方式读取这个存储账户中的Blob内容. 虽然GRS采用的是准 ...