nowcoder 寻找(LCA)
- 这个题貌似是过的最少的?
- smeow一眼给出了一个单log的算法orz
- 首先求出x和y的lca, x和c的lca,y和c的lca, 然后分类讨论以下就行了
- 实际上只有三种情况
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define M 100010
#define mmp make_pair
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int fa[M], top[M], son[M], sz[M], n, q, deep[M];
vector<int> to[M];
void dfs(int now, int f) {
fa[now] = f;
sz[now] = 1;
deep[now] = deep[f] + 1;
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
if(vj == f) continue;
dfs(vj, now);
if(sz[son[now]] < sz[vj]) son[now] = vj;
sz[now] += sz[vj];
}
}
void dfs(int now) {
if(son[now]) {
top[son[now]] = top[now];
dfs(son[now]);
}
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
if(vj == fa[now] || vj == son[now]) continue;
top[vj] = vj;
dfs(vj);
}
}
int lca(int a, int b) {
for(; top[a] != top[b]; a = fa[top[a]]) {
if(deep[top[a]] < deep[top[b]]) swap(a, b);
}
if(deep[a] > deep[b]) swap(a, b);
return a;
}
int main() {
n = read();
for(int i = 1; i < n; i++) {
int vi = read(), vj = read();
to[vi].push_back(vj), to[vj].push_back(vi);
}
dfs(1, 0);
top[1] = 1;
dfs(1);
q = read();
while(q--) {
int x = read(), y = read(), c = read();
int l1 = lca(x, y), l2 = lca(x, c), l3 = lca(y, c), ans;
if(l2 == l1) ans = l3;
else if(l3 == l1) ans = l2;
else ans = l1;
cout << ans << "\n";
}
return 0;
}
nowcoder 寻找(LCA)的更多相关文章
- POJ3728 LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- Luogu P3379 【模板】最近公共祖先(LCA)
qwq 预处理出从$x$节点向上跳2i个节点的序号$p[x][i]$及节点深度$dpth[x]$, 寻找$lca$时,从$Max$(可能的最大深度)到0枚举$i$, 首先把较深的一个节点向上跳至深度相 ...
- 两种lca的求法:树上倍增,tarjan
第一种:树上倍增 f[x,k]表示x的2^k辈祖先,即x向根结点走2^k步达到的结点. 初始条件:f[x][0]=fa[x] 递推式:f[x][k]=f[ f[x][k-1] ][k-1] 一次bfs ...
- Closest Common Ancestors---poj1470(LCA+离线算法)
题目链接:http://poj.org/problem?id=1470 题意是给出一颗树,q个查询,每个查询都是求出u和v的LCA: 以下是寻找LCA的预处理过程: void LCA(u){ f ...
- hdu-2586 How far away ?(lca+bfs+dfs+线段树)
题目链接: How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- POJ3728The merchant (倍增)(LCA)(DP)(经典)(||并查集压缩路径?)
There are N cities in a country, and there is one and only one simple path between each pair of citi ...
- POJ3728 THE MERCHANT LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- 【Luogu P3379】LCA问题的倍增解法
Luogu P3379 题意:对于两个节点,寻找他们的最近公共祖先. 一个显而易见的解法是对于每一个节点我们都往上遍历一遍,记录下它每一个祖先,然后再从另一个节点出发,一步一步往上走,找到以前记录过第 ...
- PATA-1151 LCA in a Binary Tree
题意:根据前序和中序建立树,寻找两个点的LCA. 我在之前的博客中写了关于LCA的多种求法. https://www.cnblogs.com/yy-1046741080/p/11505547.html ...
随机推荐
- 3 第一个Django应用 第2部分(管理站点)
Django会根据你写的模型文件完全自动地生成管理界面. 管理界面不是让访问网站的人使用的,它服务于网站管理者. 它用于网站的管理员. 3.1创建一个管理员用户 3.2进入管理站点 3.3管理站点的功 ...
- mpvue 转小程序实践总结
介绍 Mpvue 是一个使用 Vue.js 开发小程序的前端框架. 基础介绍 框架基于 Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序 ...
- BCP导出数据到EXCEL
SET @FilePath='D:\TEST.xls' SET @sql='bcp "SELECT * FROM XXX.dbo.XXX WITH(NOLOCK) WHERE XXX=''X ...
- 【SpringData学习】
1.注解@Modifying 在springData中,大部分给出的接口都是查询的,那要进行删除和更新的时候,大部分都需要使用@Query 进行手写代码.并且需要使用@Modifying注解. 使用场 ...
- C# 读写欧姆龙(Omron)PLC ,C#使用Fins-tcp协议读写数据
本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 ...
- 2019微软Power BI 每月功能更新系列——2月Power BI 新功能学习
哈喽,小伙伴们,我是小悦悦,好久不见~ 春节假期结束,新一轮的工作开始,祝大家猪年如意,开工大吉! 今天小悦悦带你走入猪年学习的正确打开方式——Power BI新一年的持续更新学习! Power ...
- ItelliJ idea tomcat 配置
用ItelliJ idea 开发javaWeb. 1. Idea 安装Tomcat 打开Idea,选择设置,并在设置中左边框中选择 Application Servers 点击中间空白框上面的 ’+‘ ...
- libnids-1.24 使用源码问题
从网上下载libnids-1.24源码包,解压后./configure安装. 会出现提示 checking for GLIB... configure: error: Package requirem ...
- s21day10 python笔记
s21day10 python笔记 一.函数补充 1.1 参数 基本参数知识 def get_list_date(aaa): #aaa:形式参数(形参) 任意个数 v = [11,22,33,44] ...
- 软件工程 week 02
一.地址链接 1.作业地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110 2.git仓库地址:https://git.coding. ...