博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-6031 Innumerable Ancestors(二分+树上倍增)
阅读量:5229 次
发布时间:2019-06-14

本文共 2340 字,大约阅读时间需要 7 分钟。

题意

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

思路

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

代码

#include 
#define DBG(x) cerr << #x << " = " << x << endlusing 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
st;queue
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...

转载于:https://www.cnblogs.com/DuskOB/p/10669269.html

你可能感兴趣的文章
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
发布一个JavaScript工具类库jutil,欢迎使用,欢迎补充,欢迎挑错!
查看>>
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
makefile中使用变量
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
JavaScript 鸭子模型
查看>>