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 ...
随机推荐
- mysql配置mha高可用防火墙未关闭报错
########################################################################## l 问题背景:检查主从复制之后做高可用报错 [r ...
- poj2718 Smallest Difference
思路: 暴力乱搞. 实现: #include <iostream> #include <cstdio> #include <sstream> #include &l ...
- vue 数组和对象的双向绑定不响应问题
对象和数组的数据类型是对象,对象是对象这个是毫无疑问的.数组可以把索引当成键名,把索引对应的元素当成该键名的键值. vue对象有些操作不能双向绑定的原因是vue未改变原对象,以及未给新增属性增加set ...
- 纯CSS写的对勾样式
& .cicle{ position: relative; float: right; margin-right: -1rem; ...
- 虚拟机下安装 CentOS 7 的几个小问题
※ 网络问题(Destination Host Unreachable) 安装时网络选择的"桥接"模式, 安装完毕,并配置IP地址后,发现只能ping通自己,局域网内的其他IP无法 ...
- oracle 时间格式转化以及计算
--A表中的日期字段 create_date 例如:2017-08-05 转化为2017年8月5日 oracle 在这里的双引号会忽略 select to_char(to_date(tt.c ...
- java.math.BigDecimal类multiply的使用
java.math.BigInteger.multiply(BigInteger val) 返回一个BigInteger,其值是 (this * val).声明 以下是java.math.BigInt ...
- ssh设置免秘钥登录
系统:CentOS7.2 需求:A服务器的fab用户需要使用www用户免秘钥登录到B服务器 换句话说,就是在A服务器的fab用户下,ssh www@B服务ip -p 端口 ,然后登录过去 ...
- 【原】常用shell命令
#ss -ln 监听常用端口 #netstat -an |grep 80 80端口被占用情况 #linux 下使用 tc 模拟网络延迟和丢包
- redis简介以及安装
redis作为开源的高性能的键值对数据库,本身是单线程的,性能虽然没有memcache高,但是也是性能跟memcache相差无几的,memcache是多线程的,但是redis本身功能更加强大,学习一下 ...