题意

给一棵树,$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. [树上倍增+二分答案][NOIP2012]运输计划

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

  5. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

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

  6. 最近公共祖先 LCA (Lowest Common Ancestors)-树上倍增

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

  7. 树上倍增求LCA及例题

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

  8. LCA__st算法&&树上倍增

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

  9. [HNOI2016]树(可持久化线段树+树上倍增)

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

随机推荐

  1. 安装mysql8.0.12

    安装mysql8.0.12 https://blog.csdn.net/zwj1030711290/article/details/80039780 问题1:忘记记录日志打印的密码就把窗口给关了 解决 ...

  2. 记录Nginx作为静态资源web服务场景配置

    server { listen   80; server_name    localhost; sendfile    on; access_log    /var/log/nginx/host.ac ...

  3. Linux下安装Nginx并配置一个图片服务器

    首先安装nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...

  4. Docker(4):Docker集中化web界面管理平台—Shipyard部署

    //关闭防火墙 并禁止自启 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable fir ...

  5. 《css世界》笔记之流、元素与基本尺寸

    1. 块级元素 基本特性:就是一个水平流上只能单独显示一个元素,多个块级元素则换行显示. 块级元素和"display 为block 的元素"不是一个概念,display:list- ...

  6. 03SpringBoot用JdbcTemplates访问Mysql

    03SpringBoot用JdbcTemplates访问Mysql 文章指导 学习笔记 学习代码 初始化mysql -- create table `account` DROP TABLE `acco ...

  7. Python----简单线性回归

    简单线性回归 1.研究一个自变量(X)和一个因变量(y)的关系   简单线性回归模型定义:y=β0+β1x+ε 简单线性回归方程:E(y)=β0+β1x 其中: β0为回归线的截距 β1为回归线的斜率 ...

  8. mybatis 一对多查询

    需求:一条数据对应多张表 ad_share_friends  主表 ad_share_image 图片表 建立实体 adShareFriends  和  adShareImage *注意在adShar ...

  9. Django的ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  10. Python基础:数据类型-字符串(7)

    1.字符串基本操作 字符串是由字符组成的一串字符序列,字符串是有顺序的,从左到右,索引从0开始,依次递增. Python中字符串类型:str. Python中字符串的三种表示方式: (1)普通字符串: ...