HDU-6031 Innumerable Ancestors(二分+树上倍增)

时间:2021-07-23 06:55:33

题意

给一棵树,$m$次询问,每次询问给两个点集问从两个点集中各取一个点的$LCA$的最大深度。

思路

二分答案。对于某个二分过程中得到的$Mid$,如果可行则两个点集在$Mid$所在的深度存在公共的祖先。枚举点集内的点,倍增找到他在这个深度的祖先就行。

代码

#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl using namespace std; const int N = 100000 + 5;
const int M = 200000 + 5; int n, m, k1, k2;
int tot, head[N];
int A[N], B[N];
int d[N], f[N][25], maxd, t;
struct edgenode {
int to, next;
}edge[M];
set<int> st;
queue<int> Q; void addedge(int u, int v) {
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
} void bfs() {
while(!Q.empty()) Q.pop();
Q.push(1); d[1] = 1;
while(!Q.empty()) {
int tmp = Q.front(); Q.pop();
for(int i = head[tmp]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if(d[v] != 0) continue;
d[v] = d[tmp] + 1;
f[v][0] = tmp;
for(int j = 1; j <= t; j++) f[v][j] = f[f[v][j - 1]][j - 1];
Q.push(v);
}
}
} int Find(int x, int dep) {
if(d[x] < dep) return -1;
if(d[x] == dep) return x;
for(int i = t; i >= 0; i--) if(d[f[x][i]] >= dep) x = f[x][i];
return x;
} bool judge(int x) {
st.clear();
for(int i = 1; i <= k1; i++) {
int fa = Find(A[i], x);
if(fa != -1) st.insert(fa);
}
for(int i = 1; i <= k2; i++) {
int fa = Find(B[i], x);
if(st.find(fa) != st.end()) return true;
}
return false;
} int calc(int L, int R) {
int res = L;
while(L <= R) {
int Mid = (L + R) / 2;
if(judge(Mid)) res = max(res, Mid), L = Mid + 1;
else R = Mid - 1;
}
return res;
} int main() {
while(scanf("%d%d", &n, &m) != EOF){
tot = 0;
memset(head, -1, sizeof head);
memset(f, 0, sizeof f);
memset(d, 0, sizeof d);
for(int i = 1, x, y; i <= n - 1; i++) {
scanf("%d%d", &x, &y);
addedge(x, y);
addedge(y, x);
}
t = (int)(log(n) / log(2)) + 1;
bfs();
while(m--) {
maxd = 1;
scanf("%d", &k1);
for(int i = 1; i <= k1; i++) scanf("%d", &A[i]), maxd = max(maxd, d[A[i]]);
scanf("%d", &k2);
for(int i = 1; i <= k2; i++) scanf("%d", &B[i]);
printf("%d\n", calc(1, maxd));
}
}
return 0;
}

忘了多组读入痛失1A...

HDU-6031 Innumerable Ancestors(二分+树上倍增)的更多相关文章

  1. HDU 6031 Innumerable Ancestors

    树状数组,倍增,枚举,$dfs$序. 对于每一次的询问,可以枚举$B$集合中的所有点,对于每一个点,在树上二分$LCA$,找到最低的更新答案. 判断是否是$LCA$可以搞个$dfs$序,将$A$集合中 ...

  2. HDU 4822 Tri-war(LCA树上倍增)(2013 Asia Regional Changchun)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4822 Problem Description Three countries, Red, Yellow ...

  3. HDU6031 Innumerable Ancestors 倍增 - 题意详细概括 - 算法详解

    去博客园看该题解 题目 查看原题 - HDU6031 Innumerable Ancestors 题目描述 有一棵有n个节点的有根树,根节点为1,其深度为1,现在有m个询问,每次询问给出两个集合A和B ...

  4. &lbrack;树上倍增&plus;二分答案&rsqb;&lbrack;NOIP2012&rsqb;运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 公元 2044 年,人类进入了宇宙纪元 L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n− ...

  5. 【bzoj4009】&lbrack;HNOI2015&rsqb;接水果 DFS序&plus;树上倍增&plus;整体二分&plus;树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

  6. 最近公共祖先 LCA &lpar;Lowest Common Ancestors&rpar;-树上倍增

    树上倍增是求解关于LCA问题的两个在线算法中的一个,在线算法即不需要开始全部读入查询,你给他什么查询,他都能返回它们的LCA. 树上倍增用到一个关键的数组F[i][j],这个表示第i个结点的向上2^j ...

  7. 树上倍增求LCA及例题

    先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...

  8. LCA&lowbar;&lowbar;st算法&amp&semi;&amp&semi;树上倍增

    st表 #include<cstdio> #include<algorithm> #include<cmath> using namespace std; ]; ] ...

  9. &lbrack;HNOI2016&rsqb;树(可持久化线段树&plus;树上倍增)

    [HNOI2016]树(可持久化线段树+树上倍增) 题面 给出一棵n个点的模板树和大树,根为1,初始的时候大树和模板树相同.接下来操作m次,每次从模板树里取出一棵子树,把它作为新树里节点y的儿子.操作 ...

随机推荐

  1. python复杂网络分析库NetworkX

    NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析.仿真建模等工作.networkx支持创建简单无向图.有向图和多重 ...

  2. java多线程的常用方法(以及注意事项)

    /* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5. ...

  3. C语言中char&ast; 和 char &lbrack;&rsqb;区别

    想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道. 很多人觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上 ...

  4. &lbrack;BZOJ 2594&rsqb; &lbrack;Wc2006&rsqb;水管局长数据加强版 【LCT】

    题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...

  5. dulicate symbol for architecture i386 或者其他什么CPU架构 比如i386

    昨天群里有个哥们遇到和么一个问题 , 错误的大概意思呢,就是 重复定义了  一个名字. 解决办法,只能修改名字啊. 而且,错误信息 也很明确的 支出了 重复定义的类文件名字PassGuardViewC ...

  6. 【机器学习】--xgboost初始之代码实现分类

    一.前述 上节我们讲解了xgboost的基本知识,本节我们通过实例进一步讲解. 二.具体 1.安装 默认可以通过pip安装,若是安装不上可以通过https://www.lfd.uci.edu/~goh ...

  7. 为什么AI的翻译水平还远不能和人类相比&quest;

    为什么AI的翻译水平还远不能和人类相比? https://mp.weixin.qq.com/s/0koIt-qu9IOVxNhbFcZr1Q 作者 | SHARON ZHOU 译者 | 王天宇 编辑 ...

  8. LeetCode 804 Unique Morse Code Words 解题报告

    题目要求 International Morse Code defines a standard encoding where each letter is mapped to a series of ...

  9. 一个两年Java的面试总结

    前言 16年毕业到现在也近两年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中...最终有幸去了网易.但是 ...

  10. http&colon;&sol;&sol;www&period;5xcg&period;com&sol;bbs&sol;forum&period;php&quest;mod&equals;viewthread&amp&semi;tid&equals;51143&amp&semi;extra&equals;page&percnt;3D1

    http://www.5xcg.com/bbs/forum.php?mod=viewthread&tid=51143&extra=page%3D1 因为身在酒店设备有限,只能尽量把文字 ...