HDU 6031 Innumerable Ancestors
树状数组,倍增,枚举,$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的更多相关文章
- HDU6031 Innumerable Ancestors 倍增 - 题意详细概括 - 算法详解
去博客园看该题解 题目 查看原题 - HDU6031 Innumerable Ancestors 题目描述 有一棵有n个节点的有根树,根节点为1,其深度为1,现在有m个询问,每次询问给出两个集合A和B ...
- 【HDU 6031]】 Innumerable Ancestors
题意 有一棵有n个结点的树,这里有m个询问,每个询问给出两个非空的结点集合A和B,有些结点可能同时在这两个集合当中.你需要从A和B中分别选择一个节点x和y(可以是同一个结点)你的目标是使LCA(x,y ...
- HDU-6031 Innumerable Ancestors(二分+树上倍增)
题意 给一棵树,$m$次询问,每次询问给两个点集问从两个点集中各取一个点的$LCA$的最大深度. 思路 二分答案.对于某个二分过程中得到的$Mid$,如果可行则两个点集在$Mid$所在的深度存在公共的 ...
- HDU6031:Innumerable Ancestors(二分+倍增数组)
传送门 题意 n个点的图,有n-1条无向边,m个询问,每次询问 给出两个集合a和b,找到a的一个元素x,b的一个元素y,使得x和y的lca深度最大 分析 这道题如果直接暴力做,复杂度为O(mk1k2* ...
- HDU 1330 Nearest Common Ancestors(求两个点的近期公共祖先)
题目链接:id=1330">传送门 在线算法: #include <iostream> #include <cstdio> #include <cstri ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu 4553 约会安排
约会安排 http://acm.hdu.edu.cn/showproblem.php?pid=4553 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
随机推荐
- JavaSE的学习路线
基于现阶段的JavaEE学习的对象,主要是趋向于Web的方向,主要就是说在JavaWeb的基础上进行进一步的开发和学习,下面我会将自己总结的对于自己的一点关于JavaEE学习路线会逐步讲解. 第一部分 ...
- (转)linux下vi命令修改文件及保存的使用方法
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi n filename :打开文件,并将光标置于第n行首 vi filename :打开 ...
- Vue的keep-alive
Vue的keep-alive: 简答的做下理解 缓存!页面从某一个页面跳转到另一个页面的时候,需要进行一定的缓存,然后这个时候调用的钩子函数是actived,而在第一次加载的时候,created.ac ...
- win10-idea2018
下载jar JetbrainsCrack-2.9-release-enc.jar idea64.exe.vmpotions 配置 -javaagent:D:\devsoft\idea\bin\Jetb ...
- 【IDEA】IDEA设置新建文件的模板
今天在IDEA中新建JS文件的时候想着也像WebStorm一样可以显示作者和时间,所以就研究了下在IDEA中修改文件创建时的模板. 点击settings找到File and Code Template ...
- linux常用函数简单介绍
mmap函数简介: mmap函数是unix/linux下的系统调用,来看<Unix Netword programming>卷二12.2节对mmap的介绍: The mmap functi ...
- 去除\ufeff的解决方法,python语言
语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现 \ ...
- myeclipse/eclipse安装反编译插件jadclipse
jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,下面像大家介绍下如何将jadclipse加入到myeclipse/eclipse中. 文件下载 (1) ...
- 转:google测试分享-问题和挑战
原文: http://blog.sina.com.cn/s/blog_6cf812be0102vxer.html 前言:这个系列分享的内容大部分都是出自于<google是如何测试的>的书, ...
- CentOS系统yum源配置修改、yum安装软件包源码包出错解决办法apt.sw.be couldn't connect to host
yum安装包时报错: Could not retrieve mirrorlist http://mirrorlist.repoforge.org/el6/mirrors-rpmforge error ...