原题地址

根据提示用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 最近公共祖先·三的更多相关文章

  1. hihoCoder week17 最近公共祖先·三 lca st表

    记录dfs序列,dfn[tot] 记录第tot次访问的节点 然后查两点在dfs序中出现的第一次 id[u] id[v] 然后  找 dep[k] = min( dep[i] ) {i 属于 [id[u ...

  2. hihocoder1069 最近公共祖先·三(tarjin算法)(并查集)

    #1069 : 最近公共祖先·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的“最近公共祖先”网站,但是 ...

  3. HihoCoder 1067 最近公共祖先(ST离线算法)

    最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个 ...

  4. hihocoder #1062 : 最近公共祖先·一(小数据量 map+set模拟+标记检查 *【模板】思路 )

    #1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...

  5. 最近公共祖先-三(RMQ-ST)

    描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的"最近公共祖先"网站,但是很快这样一个离线算法就出现了问题:如果只有一个人提出了询问,那么小Hi和小Ho很难决定 ...

  6. Hihocoder #1067 : 最近公共祖先·二

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...

  7. hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]

    传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...

  8. hihoCoder 1062 最近公共祖先·一 最详细的解题报告

    题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其 ...

  9. 【hihoCoder第十七周】最近公共祖先·三

    之前就写的是离线算法.思路就是先序一遍树,记录层数,然后高效RMQ就好.ST和线段树都能过. 以后有时间将之前的在线算法补上. #include <bits/stdc++.h> using ...

随机推荐

  1. jacaScript数组

    1.var arr=['1','2','3'] typeof arr (判断数组类型)    print(arr)打印数组内容 2.arr[100]='x',  数组中间自动添加,alert(arr. ...

  2. 微信小程序button授权页面,用户拒绝后仍可再次授权

    微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js  中的 onLaunch或onShow中加如下代 ...

  3. 浏览器和ES5的介绍

    浏览器的组成 : shell(浏览器的外壳).内核(渲染引擎.js引擎)主流浏览器及其内核: IE                    tritent(IE9及以下,IE10及以上用webkit) ...

  4. php自动加载函数

    含义:将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 先看__autoload 函数 printit.class.php <?php class PRI ...

  5. 慎将MBTI测试用于招聘或就业:4星|《人格魅力修炼指南》

    人格魅力修炼指南:成为理想中的自己,就靠它了!(<哈佛商业评论>增刊) <哈佛商业评论>的11篇领导者人格魅力相关的文章.比较专业. 一些重要的信息:慎将MBTI测试用于“招聘 ...

  6. CAD参数绘制椭圆弧(com接口)

    在CAD设计时,需要绘制椭圆弧,用户可以设置椭圆弧基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipseArc 绘制椭圆弧.详细说明如下: 参数 说明 DOUBLE dCente ...

  7. VC++检测硬件设备状态

    首先捕捉WM_DEVICECHANGE消息,该消息在usb插拔时均有触发. MFC下 添加消息处理函数afx_msg BOOL OnDeviceChange( UINT nEventType, DWO ...

  8. window10换系统为windows7

    第一步 第二步 第三步 下载系统:http://www.dnxtc.net 1.GHO镜像安装器和WIN7,GHO文件必须一起放在除C盘外的其他盘的根目录 2.“GHO镜像安装器“工具上右键管理员方式 ...

  9. linux 小键盘 数字键盘 wiki

    https://wiki.archlinux.org/index.php/Activating_Numlock_on_Bootup_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96 ...

  10. React Components之间的通信方式了解下

    先来几个术语: 官方 我的说法 对应代码 React element React元素 let element=<span>A爆了</span> Component 组件 cla ...