1128 - Greatest Parent---LightOj(LCA+离线算法)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1128
给你一颗树,树的每个节点都有一个权值,树根是节点0,权值为1,树中每个节点的权值都是大于父节点的权值的;
然后给出每个节点的父节点以及该节点的权值;有Q个询问,每个询问有两个数u和val,求u的祖先中权值>=val的最大祖先,就是离u最远的那个>=val的祖先的节点;
数的范围较大有5w个Q,1w个n,所以我们不能直接模拟,也许这1w个节点是一串下来的,那么复杂度就变成了nQ必定会TLE;
我们知道每个节点i要找祖先中>=val的一定要从根节点到i的路径上去找,所以我们可以用二分;具体看代码吧;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <math.h> using namespace std; #define met(a, b) memset(a, b, sizeof(a))
#define N 100053
#define INF 0x3f3f3f3f
const int MOD = 1e9+; typedef long long LL; struct node
{
int Index, val;
node(){}
node(int Index, int val) : Index(Index), val(val){}
}; int v[N], n, ans[N], Time, Node[N];
vector<vector<int> >G;
vector<vector<node> >Q; int Find(int val)
{
int L = , R = Time, ans = Time;
while(L<=R)
{
int Mid = (L+R)/;
if(v[Node[Mid]] >= val)
{
R = Mid-;
ans = Mid;
}
else
L = Mid+;
}
return Node[ans];
} void dfs(int u)
{
Node[++Time] = u;///Node[i]表示从根节点0到节点i的深度; int len = Q[u].size();///在询问中 问u节点的我们可以从根节点到u节点这个路径上寻找v大于val的节点,用二分法;
for(int i=; i<len; i++)
{
node p = Q[u][i];
ans[p.Index] = Find(p.val);///把结果保存起来;
} for(int i=, L=G[u].size(); i<L; i++)
dfs(G[u][i]); Time--;///返回上一层,深度要减;
} int main()
{
int T, q, t = ;
scanf("%d", &T);
while(T--)
{
met(v, );
v[] = ; scanf("%d %d", &n, &q); G.clear();
G.resize(n+); Q.clear();
Q.resize(n+); int f, u, num;
for(int i=; i<n; i++)
{
scanf("%d %d", &f, &v[i]);
G[f].push_back(i);
}
for(int i=; i<=q; i++)
{
scanf("%d %d", &u, &num);
Q[u].push_back(node(i, num));
} Time = ;
dfs(); printf("Case %d:\n", t++);
for(int i=; i<=q; i++)
printf("%d\n", ans[i]);
}
return ;
}
1128 - Greatest Parent---LightOj(LCA+离线算法)的更多相关文章
- Tarjan的LCA离线算法
LCA(Least Common Ancestors)是指树结构中两个结点的最低的公共祖先.而LCA算法则是用于求两个结点的LCA.当只需要求一对结点的LCA时,我们很容易可以利用递归算法在O(n)的 ...
- Closest Common Ancestors---poj1470(LCA+离线算法)
题目链接:http://poj.org/problem?id=1470 题意是给出一颗树,q个查询,每个查询都是求出u和v的LCA: 以下是寻找LCA的预处理过程: void LCA(u){ f ...
- HDU 2874 Connections between cities(LCA离线算法实现)
http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...
- LCA离线算法Tarjan详解
离线算法也就是需要先把所有查询给保存下来,最后一次输出结果. 离线算法是基于并查集实现的,首先就是初始化P[i] = i. 接下来对于每个点进行dfs: ①首先判断是否有与该点有关的查询,如果当前该点 ...
- poj1330+hdu2586 LCA离线算法
整整花了一天学习了LCA,tarjan的离线算法,就切了2个题. 第一题,给一棵树,一次查询,求LCA.2DFS+并查集,利用深度优先的特点,回溯的时候U和U的子孙的LCA是U,U和U的兄弟结点的子孙 ...
- Lightoj 1128 - Greatest Parent
Gate 倍增模板,在一个严格小根堆中,给定$x,y$,求$x$的祖先中$≥y$的最高点. 注意清零 #include<cstdio> #include<iostream> # ...
- 距离LCA离线算法Tarjan + dfs + 并查集
距离B - Distance in the Tree 还是普通的LCA但是要求的是两个节点之间的距离,学到了一些 一开始我想用带权并查集进行优化,但是LCA合并的过程晚于离线计算的过程,所以路径长度会 ...
- LCA离线算法Tarjan的模板
hdu 2586:题意:输入n个点的n-1条边的树,m组询问任意点 a b之间的最短距离 思路:LCA中的Tarjan算法,RMQ还不会.. #include <stdio.h> #inc ...
- HDU 2874 LCA离线算法 tarjan算法
给出N个点,M条边.Q次询问 Q次询问每两点之间的最短距离 典型LCA 问题 Marjan算法解 #include "stdio.h" #include "strin ...
随机推荐
- 递归的几个demo
/** * Created by root * Description : 递归函数 */ object RecursionTest { def main(args: Array[String]): ...
- 使用dshow捕获摄像头图像
#include "stdafx.h" #include <DShow.h> #include <Guiddef.h> #include <strmi ...
- php安装xdebug后var_dump输出没有格式化的问题
开发环境,装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内容却没有使用html格式化 这时想到估计是php.ini里面的某个输出的配 ...
- 安装windows7/8/10到U盘或移动硬盘
https://jingyan.baidu.com/article/e52e36156f6ad240c60c518c.html jpg改rar
- linux 设置pip 镜像 Pip Warning:–trusted-host 问题解决方案
pip升级到7.0以后,在使用http镜像进行包安装及升级的时候往往会有如下提示: Collecting beautifulsoup4The repository located at mirrors ...
- 【大数据系列】Hadoop DataNode读写流程
DataNode的写操作流程 DataNode的写操作流程可以分为两部分,第一部分是写操作之前的准备工作,包括与NameNode的通信等:第二部分是真正的写操作. 一.准备工作 1.首先,HDFS c ...
- 【大数据系列】win10上安装hadoop开发环境
为了方便采用了Cygwin模拟linux环境的方法 一.安装JDK以及下载hadoop hadoop官网下载hadoop http://hadoop.apache.org/releases.html ...
- loop设备及losetup命令
1. loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件.在使用之前,一个 loop 设备必 ...
- vue 项目要使用的库
1.Stylus是一个CSS预处理器. npm install stylus --save-dev npm install stylus-loader --save-dev 使用 <style ...
- [转] 基于TINY4412的Andorid开发-------简单的LED灯控制
阅读目录 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源代码情景分析> ...