树状数组,倍增,枚举,$dfs$序。

对于每一次的询问,可以枚举$B$集合中的所有点,对于每一个点,在树上二分$LCA$,找到最低的更新答案。

判断是否是$LCA$可以搞个$dfs$序,将$A$集合中所有点标$1$,然后查询子树对应的区间上的区间和。

#include <bits/stdc++.h>
using namespace std; const int maxn = ;
int L[maxn],R[maxn];
int c[*maxn];
int h[maxn];
int to[*maxn];
int nx[*maxn];
int sz;
int tt;
int dp[][];
int dep[];
int ans;
int n,m; int k1,k2;
int A[],B[]; void add(int a,int b)
{
to[sz] = b;
nx[sz] = h[a];
h[a] = sz++;
} void dfs(int x,int y)
{
L[x] = tt; tt++;
dp[x][] = y; if(y==-) dep[x]=;
else dep[x] = dep[y]+; for(int i=h[x];i!=-;i = nx[i])
{
if(L[to[i]]) continue;
dfs(to[i],x);
}
R[x] = tt; tt++;
} int lowbit(int x)
{
return x&(-x);
} void update(int pos,int val)
{
for(int i=pos;i<=*n;i=i+lowbit(i))
{
c[i] += val;
}
} int get(int pos)
{
int res=; for(int i=pos;i>;i=i-lowbit(i))
{
res=res+c[i];
} return res;
} void work(int x)
{
while()
{
int Q = dp[x][];
if(get(R[Q])-get(L[Q]-))
{
ans = max(ans,dep[Q]);
break;
} for(int i=;i>=;i--)
{
int to = dp[x][i];
if(to==-) continue;
if(get(R[to])-get(L[to]-)) continue;
x=to;
break;
}
} x = dp[x][];
ans = max(ans,dep[x]);
} int main()
{
while(~scanf("%d%d",&n,&m))
{
sz=; for(int i=;i<=n;i++)
{
c[i]=;
h[i]=-;
L[i]=;
R[i]=;
} for(int i=;i<=n-;i++)
{
int a,b; scanf("%d%d",&a,&b);
add(a,b); add(b,a);
} tt=; dfs(,-); for(int j=;j<=;j++)
{
for(int i=;i<=n;i++)
{
if(dp[i][j-]==-) dp[i][j]=-;
else dp[i][j] = dp[dp[i][j-]][j-];
}
} for(int i=;i<=m;i++)
{
scanf("%d",&k1); for(int j=;j<=k1;j++) scanf("%d",&A[j]), update(L[A[j]],);
scanf("%d",&k2); ans=; for(int j=;j<=k2;j++)
{
scanf("%d",&B[j]);
if(get(R[B[j]])-get(L[B[j]]-))
{
ans = max(ans,dep[B[j]]);
continue;
} work(B[j]);
} printf("%d\n",ans); for(int j=;j<=k1;j++) update(L[A[j]],-);
}
}
return ;
}

HDU 6031 Innumerable Ancestors的更多相关文章

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

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

  2. 【HDU 6031]】 Innumerable Ancestors

    题意 有一棵有n个结点的树,这里有m个询问,每个询问给出两个非空的结点集合A和B,有些结点可能同时在这两个集合当中.你需要从A和B中分别选择一个节点x和y(可以是同一个结点)你的目标是使LCA(x,y ...

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

    题意 给一棵树,$m$次询问,每次询问给两个点集问从两个点集中各取一个点的$LCA$的最大深度. 思路 二分答案.对于某个二分过程中得到的$Mid$,如果可行则两个点集在$Mid$所在的深度存在公共的 ...

  4. HDU6031:Innumerable Ancestors(二分+倍增数组)

    传送门 题意 n个点的图,有n-1条无向边,m个询问,每次询问 给出两个集合a和b,找到a的一个元素x,b的一个元素y,使得x和y的lca深度最大 分析 这道题如果直接暴力做,复杂度为O(mk1k2* ...

  5. HDU 1330 Nearest Common Ancestors(求两个点的近期公共祖先)

    题目链接:id=1330">传送门 在线算法: #include <iostream> #include <cstdio> #include <cstri ...

  6. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  7. hdu 4553 约会安排

    约会安排 http://acm.hdu.edu.cn/showproblem.php?pid=4553 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  8. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  9. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

随机推荐

  1. echarts 分组绘制柱状图

    示意图: 代码如下: <!DOCTYPE html> <html style="height: 100%"> <head> <meta c ...

  2. C++ string功能补充(类型互转,分割,合并,瘦身)

    int StringUtil::intFromString(string data) { //NOTE atoi是非标准C函数 return atoi(data.c_str()); } string ...

  3. libxml2在mingw下编译

    1.配置MingW路径,在环境变量path中加入/mingw32/bin2.解压libxml,进入win32目录3.记事本打开configure.js,找到var compiler = "m ...

  4. API图片路径和超链接语义化转换

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. css纯数字或字母换行

    #div { word-wrap:break-word; word-break:break-all; }

  6. (32位)本体学习程序(ontoEnrich)系统配置说明文档

    1.系统环境 32位 Ubuntu 源代码中已经包含在32位下编译生成的.o文件,配置好依赖库(步骤2)后,参考步骤3则可重新link. link无误即可运行程序. 2.依赖库  2.1 boost_ ...

  7. IIS 网站日志分析

    最近由于ADSL代理总出问题,导致爬虫服务器总被目标网站封,由于请求内容总是空,前端APP获取不到想要的内容就一直刷新,导致爬虫服务器请求更加繁忙. 爬虫服务器每执行完一个流程,都会给统计服务器Pos ...

  8. 【BZOJ】1572: [Usaco2009 Open]工作安排Job

    [题意]给定n项工作的截止时间和价值,每项工作需要1单位时间完成,求最大价值.n<=10^5. [算法]贪心+堆 [题解] 如果是访问到x时将d[x]前的点从价值最大的能加就加是错误的贪心,因为 ...

  9. Spring Boot中使用log4j实现http请求日志入mongodb

    之前在<使用AOP统一处理Web请求日志>一文中介绍了如何使用AOP统一记录web请求日志.基本思路是通过aop去切web层的controller实现,获取每个http的内容并通过log4 ...

  10. Java读取大文件的高效率实现

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...