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 ...
随机推荐
- 什么是JavaFX
什么是JavaFX JavaFx平台是一个富客户端平台解决方案,它能够使用应用程序开发人员轻松的创建跨平台的富客户端应用程序.它构建在Java技术的基础之上,JavaFX平台提供了一组丰富的图形和媒体 ...
- 前端PHP入门-003-echo离不开它,注释看人品
不要自以为是,瞪着双眼看是没有用的!因为你不是天才! 永远不要自欺欺人,写不出来代码就是不会. 不要问为什么?我头疼! 我接触的人当中,以为自己已经很很很牛X了,总是问为什么这么写? [心中吐槽]:我 ...
- libuv的多线程之间传递消息
官网上给出的例子http://nikhilm.github.io/uvbook/threads.html#inter-thread-communication,中文理解在后边 Inter-thread ...
- C++对象与其第一个非静态成员地址相同
由于对象的内存空间里是按顺序依次存储了它的非静态成员变量,因此对象和它的第一个非静态成员变量的地址是相同的: class A { private: int i; } int main() { A a; ...
- HDU 1431 思维 基础数论
找范围内回文素数,最大到1e8,我就是要枚举回文串,再判素数,然后因为这种弱智思路死磕了很久题目. /** @Date : 2017-09-08 15:24:43 * @FileName: HDU 1 ...
- 使用纯 CSS 实现响应式的图片显示效果
有许多方法可以实现页面里图像的响应式显示(Responsive).然而,我碰到的所有方案都使用了JavaScript.这使我疑惑不用 JavaScript 实现图像响应是否可行. 我提出了下面纯CSS ...
- 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT
[题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...
- 【洛谷P2515【HAOI2010】】软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- php常用函数——数学函数
php常用函数——数学函数
- pycharm设置字体大小
pycharm 是很好的一个IDE,在windows下,和macOS下,都能很好的运行.唯一缺点是启动慢. 默认字体太小,在mac下,需要瞪大24K氪金狗眼才能看清. 为了保护好眼睛,我们需要把字体调 ...