hihoCoder#1069 最近公共祖先·三
根据提示用Spase Table做
将Tree先展成List,因为数组长度等于边数的2倍,树中边数等于节点数-1,所以List数组只要开2倍节点数大小即可
WA了几次,原来是查询的时候出现左边界大于右边界的情况,所以这种情况要颠倒一下
代码:
#include <iostream>
#include <vector>
#include <string>
#include <map> using namespace std; #define MAX_NODE 100005 int N, M;
map<string, int> a2i;
string i2a[MAX_NODE];
int traverse_path[MAX_NODE * ];
int depth[MAX_NODE];
int st[MAX_NODE * ][]; // 保存的是节点编号
vector<int> child[MAX_NODE];
int last_position[MAX_NODE];
int path_length = ;
int tree_size = ; void traverse(int r, int d) {
traverse_path[path_length++] = r;
depth[r] = d;
for (auto c : child[r]) {
traverse(c, d + );
traverse_path[path_length++] = r;
}
last_position[r] = path_length - ;
} void build() {
for (int i = ; i < path_length; i++)
st[i][] = traverse_path[i]; for (int j = ; ( << j) <= path_length; j++) {
for (int i = ; i + ( << j) <= path_length; i++) {
int a = st[i][j - ];
int b = st[i + ( << (j - ))][j - ];
st[i][j] = depth[a] < depth[b] ? a : b;
}
}
} int query(int l, int r) {
if (l > r)
return query(r, l);
int len = r - l + ;
int i = ;
while (( << (i + )) <= len)
i++;
int a = st[l][i];
int b = st[r - ( << i) + ][i];
return depth[a] < depth[b] ? a : b;
} int main() {
scanf("%d", &N);
for (int i = ; i < N; i++) {
string a, b;
int ai, bi;
cin >> a >> b;
if (a2i.find(a) == a2i.end()) {
ai = a2i[a] = tree_size;
i2a[ai] = a;
tree_size++;
}
else
ai = a2i[a];
if (a2i.find(b) == a2i.end()) {
bi = a2i[b] = tree_size;
i2a[bi] = b;
tree_size++;
}
else
bi = a2i[b];
child[ai].push_back(bi);
} traverse(, );
build(); scanf("%d", &M);
while (M--) {
string a, b;
int ai, bi;
cin >> a >> b;
ai = a2i[a];
bi = a2i[b];
cout << i2a[query(last_position[ai], last_position[bi])] << endl;
} return ;
}
hihoCoder#1069 最近公共祖先·三的更多相关文章
- hihoCoder week17 最近公共祖先·三 lca st表
记录dfs序列,dfn[tot] 记录第tot次访问的节点 然后查两点在dfs序中出现的第一次 id[u] id[v] 然后 找 dep[k] = min( dep[i] ) {i 属于 [id[u ...
- hihocoder1069 最近公共祖先·三(tarjin算法)(并查集)
#1069 : 最近公共祖先·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的“最近公共祖先”网站,但是 ...
- HihoCoder 1067 最近公共祖先(ST离线算法)
最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个 ...
- hihocoder #1062 : 最近公共祖先·一(小数据量 map+set模拟+标记检查 *【模板】思路 )
#1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...
- 最近公共祖先-三(RMQ-ST)
描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的"最近公共祖先"网站,但是很快这样一个离线算法就出现了问题:如果只有一个人提出了询问,那么小Hi和小Ho很难决定 ...
- Hihocoder #1067 : 最近公共祖先·二
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
- hihoCoder 1062 最近公共祖先·一 最详细的解题报告
题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其 ...
- 【hihoCoder第十七周】最近公共祖先·三
之前就写的是离线算法.思路就是先序一遍树,记录层数,然后高效RMQ就好.ST和线段树都能过. 以后有时间将之前的在线算法补上. #include <bits/stdc++.h> using ...
随机推荐
- 配置Ubuntu16.04第01步:U盘安装 Ubuntu 16.04系统
Ubuntu 每年发布两个版本,Ubuntu 16.04 开发代号为“Xenial Xerus”,为第六个长期支持(LTS)版本. 1. 制作U盘系统安装盘 1.1下载最新的Universal USB ...
- Maven环境搭建操作记录
Maven官方网站: http://maven.apache.org/index.html Maven下载地址: http://maven.apache.org/download.cgi Maven历 ...
- 使用mysql实现mybatis的分页效果
1.mybatis.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configur ...
- zojDakar Rally(01背包)
01背包 加上每次更新解题数目最多 总用时最少 因为要保证用时最少,要先把时长由小到大排序. 没排序 WA了几小时..链接 #include <iostream> #include< ...
- sdut1933WHUgirls(dp)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933 矩形的dp一般挺类似 大的矩形都是由小 ...
- div 弹出 居中
function show_tc_conv(){var x=jq13(window).width()/2;var y=jq13(window).height()/2; var div_w=jq13(& ...
- 纯css实现的三级水平导航菜单
vscode练习使用开发纯css的三级水平导航菜单.先上图: 1.html5布局 <html> <head> <meta charset="UTF-8" ...
- Android IJKPlayer缓冲区设置以及播放一段时间出错解决方案
IJKPlayer拖动播放进度会导致重新请求数据,未使用已经缓冲好的数据,所以应该尽量控制缓冲区大小,减少不必要的数据损失. mMediaPlayer.setOption(IjkMediaPlayer ...
- Bmob使用心得
1.在 Project 的 build.gradle 文件中添加 Bmob的maven仓库地址,示例如下:(注意文字说明部分): allprojects { repositories { jcente ...
- Java语法基础-异常处理
异常处理类层次结构图 检查异常与非检查异常 非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类.javac在编译时,不会提示和发现这 ...