hihoCoder week17 最近公共祖先·三 lca st表
记录dfs序列,dfn[tot] 记录第tot次访问的节点
然后查两点在dfs序中出现的第一次 id[u] id[v]
然后 找 dep[k] = min( dep[i] ) {i 属于 [id[u], id[v]]}
最后dfn[k] 就是所求..
感觉弄来弄去 就是 在映射... 无非就是 求一段序列深度最小的节点编号
#include <bits/stdc++.h>
using namespace std; const int N = 2e5+; int n, cnt, tot, dp[N][]; // dp[i][j] [i, i+(1<<j)-1]
vector<int> G[N]; map<string ,int> mp;
string s1,s2,s[N]; int dfn[N], id[N], dep[N];
int getId(string str)
{
if(mp[str])
return mp[str];
mp[str] = ++cnt;
s[cnt] = str;
return cnt;
} void dfs(int u,int fa,int d)
{
id[u] = tot;
dfn[tot] = u;
dep[tot++] = d; for(int i=; i<G[u].size(); i++) {
int v = G[u][i];
dfs(v, u, d+);
dfn[tot] = u;
dep[tot++] = d;
}
return ;
} void st_init(int sz)
{
for(int i=; i<=sz; i++)
dp[i][] = i;
for(int j=; (<<j)<=sz; j++)
{
for(int i=; i+(<<j)-<=sz; i++)
{
int x = dp[i][j-];
int y = dp[i+(<<(j-))][j-];
if(dep[x] < dep[y])
dp[i][j] = x;
else
dp[i][j] = y;
}
}
} void init()
{
tot = ;
dfs(, , );
st_init(tot-);
} int query(int u,int v)
{
u = id[u], v = id[v];
if(v < u)
swap(v,u);
int t = log2(v-u+);
int x = dp[u][t];
int y = dp[v-(<<t)+][t];
if(dep[x] < dep[y])
return x;
else
return y;
}
int main()
{
freopen("in.txt","r",stdin);
ios::sync_with_stdio();
cin >> n;
for(int i=; i<n; i++) {
cin >> s1 >> s2;
int u = getId(s1);
int v = getId(s2);
G[u].push_back(v);
}
init();
int m; cin >> m;
for(int i=; i<m; i++) {
cin >> s1 >> s2;
int u = getId(s1);
int v = getId(s2);
int x = dfn[query(u,v)];
cout << s[x] <<"\n";
}
return ;
}
hihoCoder week17 最近公共祖先·三 lca st表的更多相关文章
- hihoCoder#1069 最近公共祖先·三
原题地址 根据提示用Spase Table做 将Tree先展成List,因为数组长度等于边数的2倍,树中边数等于节点数-1,所以List数组只要开2倍节点数大小即可 WA了几次,原来是查询的时候出现左 ...
- 最近公共祖先问题 LCA
2018-03-10 18:04:55 在图论和计算机科学中,最近公共祖先,LCA(Lowest Common Ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点. 计算 ...
- 「LuoguP3379」 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...
- 最近公共祖先:LCA及其用倍增实现 +POJ1986
Q:为什么我在有些地方看到的是最小公共祖先? A:最小公共祖先是LCA(Least Common Ancestor)的英文直译,最小公共祖先与最近公共祖先只是叫法不同. Q:什么是最近公共祖先(LCA ...
- P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 洛谷——P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 【原创】洛谷 LUOGU P3379 【模板】最近公共祖先(LCA) -> 倍增
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
随机推荐
- steam Depot 生成与应用脚本
Depot 生成脚本 首先为您上传的每个 Depot 创建一个 Depot 生成脚本.从复制 depot_build_1001.vdf 脚本开始,并按将上传的 Depot ID 命名. Depot 生 ...
- Sitecore CMS中创建模板
如何在Sitecore CMS中创建模板. 在/sitecore/templates选择应创建模板的文件夹中. 注意:在多站点项目中,通常会在模板所属的网站名称的/sitecore/templates ...
- 【2017-03-20】HTML框架,标题栏插入小图标,锚点,插入音频视频,滚动效果
一.html框架 iframe 在网页中嵌入一个别的网页 1.格式: <iframe src="链接地址" width="" height=&quo ...
- xshell中出现的绿色背景的文件夹
这种文件夹表示权限为777的文件夹 可以使用chmod 777 fileName进行权限修改 如果需要将文件夹以及其子文件夹的权限全部置为777 chmod 777 -R directoryName/ ...
- eclipse中的tomca的编辑页面server location灰色
clipse中tomcat service设置 选择window ----show view---services可以看到服务的面板 双击tomcat进入配置界面Service Locations(S ...
- .net大型平台通过Nginx做负载均衡(Web层、中间服务层、DB层)
.net平台下,我目前部署过的均衡负载有两种方式(iis7和Nginx),以下以Nginx为例讲解web层的均衡负载. 简介:Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx ...
- 前端框架VUE----es6简单介绍
1.ECMAScript 6 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScr ...
- Python爬虫——小说
#encoding:utf8 import re import urllib2 url = 'http://www.23us.com/html/55/55304/' request = urllib2 ...
- JS3D效果
<!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...
- qt裁剪
1. qt裁剪是什么,qt有哪些模块 1.1 2. windows消息机制,qt的signal slot,android/ios消息机制?