hdu_4547_CD操作(在线LCA)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4547
题意:中文,不解释
题解:很裸的LCA,注意父目录打开子目录一次就够了,这里我才用倍增在线LCA+map过
#include<cstdio>
#include<iostream>
#include<map>
#include<string>
#define F(i,a,b) for(int i=a;i<=b;i++)
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
map<string,int>cnt;
const int N=1e5+,DEG=;
int t,n,m,a,b,ed,g[N],nxt[N],v[N],w[N],fa[N][DEG],dep[N],idx;
bool fg[N];
string s1,s2;
inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;} int Abs(int a){return a>?a:-a;}
void dfs(int u,int pre){
dep[u]=dep[pre]+,fa[u][]=pre;
F(i,,DEG-)fa[u][i]=fa[fa[u][i-]][i-];
for(int i=g[u];~i;i=nxt[i])if(v[i]!=pre)dfs(v[i],u);
} int LCA(int a,int b){
if(dep[a]>dep[b])a^=b,b^=a,a^=b;
if(dep[a]<dep[b])F(i,,DEG-)if((dep[b]-dep[a])&(<<i))b=fa[b][i];
if(a!=b)for(int i=DEG-;i<?a=fa[a][]:,i>=;i--)
if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];
return a;
} int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
cnt.clear();
F(i,,n)g[i]=-,fg[i]=;ed=,idx=;
F(i,,n-){
cin>>s1>>s2;
a=cnt[s1],cnt[s1]=(a==)?idx++:a,a=(a==?idx-:a);
b=cnt[s2],cnt[s2]=(b==)?idx++:b,b=(b==?idx-:b);
adg(b,a),fg[a]=;
}
int root;
F(i,,n)if(!fg[i]){root=i;break;}
dep[root]=;
dfs(root,root);
F(i,,m){
cin>>s1>>s2;
a=cnt[s1],b=cnt[s2];
int lca=LCA(a,b),ans=;
if(lca==a&&lca!=b)ans=;
else if(lca==b&&lca!=a)ans=Abs(dep[a]-dep[b]);
else if(lca!=a&&lca!=b)ans=Abs(dep[a]-dep[lca])+;
printf("%d\n",ans);
}
}
return ;
}
hdu_4547_CD操作(在线LCA)的更多相关文章
- 在线LCA模板
在线LCA 如求A,B两点的LCA,先计算出各个结点的深度d[],然后,通过递推公式求出各个结点的2次方倍的祖先p[],假设d[A] > d[B],则找到d[p[A][i]] == d[B]也就 ...
- hdu3078 建层次树+在线LCA算法+排序
题意:n个点,n-1条边构成无向树,每个节点有权,Q次询问,每次或问从a->b的最短路中,权第k大的值,/或者更新节点a的权, 思路:在线LCA,先dfs生成树0,标记出层数和fa[](每个节点 ...
- 每日算法——新型在线LCA
在线LCA一般大家都会用倍增吧,时间复杂度O(nlogn),空间复杂度O(nlogn),都是非常严格的复杂度限制,并且各种边界处理比较麻烦,有没有更快更好的办法呢? 我们发现,在树链剖分时,我们不经意 ...
- 【HDU 4547 CD操作】LCA问题 Tarjan算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和 ...
- HDU 4547 CD操作 (LCA最近公共祖先Tarjan模版)
CD操作 倍增法 https://i.cnblogs.com/EditPosts.aspx?postid=8605845 Time Limit : 10000/5000ms (Java/Other) ...
- thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。
最近弄一个图片 上传,可是用ueditor 自带的上传,如果不配置的话,上传的目录不在自己的项目中. 在网上找了好多,可是都是底版本的,新版本的还真是找到了一个,ueditor-thinkphp 这个 ...
- HDU 2586.How far away ?-在线LCA(ST)-代码很认真的写了注释(捞到变形)
2018.9.10 0:40 重新敲一遍,然后很认真的写了注释,方便自己和队友看,刚过去的一天的下午打网络赛有一题用到了这个,但是没写注释,队友改板子有点伤,因为我没注释... 以后写博客,代码要写注 ...
- HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)
题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的很easy,仅仅须要找到l-r区间内的dfs序最大的和最小的就能够.那么用线段树或者RMQ维护一下区间最值就能够了.然后就是找dfs序最大 ...
- poj 2763(在线LCA+树状数组)
Housewife Wind After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ord ...
随机推荐
- PHP面向对象编程 对象的基本概念 PHP面向对象的基本实践 PHP面向对象的高级实践 PHP面向对象的特殊实践
再次梳理一下面向对象编程的要点. 此文是以php为例,但思想是通用的. 总结的PHP面向对象编程笔记 对象的基本概念 对象的基本构成 对象包含两部分 一.对象的组成元素 是对象的数据模型,用于描述对象 ...
- MySQL数据库传输BLOB类型数据丢失 解决办法
修改MySQL安装目录下my.ini文件配置:
- jQuery 3D canvas 旋转木马(跑马灯)效果插件 - cloud carousel
插件名称-cloud carousel 最新版本-1.0.5 支持ie6-ie9,firefox,chrome,opera,safari等 1.引入jquery1.4.2.js 和CloudCarou ...
- fopen()函数以"a+"方式打开一个不存在的文件后读写出现问题
问题:在完成课后习题的时候,使用fopen()函数以"a+"方式打开一个不存在的文件时,写入.读取出现错误: //添加用户输入单词后,在单词头加入编号,确保编号跟着前面的开始排序 ...
- Chapter 2 Open Book——23
Mike interrupted us then — he was planning an epic battle of the blizzard in the parking lot after s ...
- Node.js:常用工具util
概要:本篇博客的主要内容是介绍node.js的常用工具util. 1.util.inherits util.inherits(constructor,superConstructor)是一个实现对象间 ...
- XML 用途
XML 用途 XML 应用于 Web 开发的许多方面,常用于简化数据的存储和共享. XML 把数据从 HTML 分离 如果您需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编 ...
- ubutun下安装jenkins
安装方法所在网址: https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu 在安装jenkins之前,ub ...
- HUST 1358 Uiwurerirexb jeqvad(模拟解密)
Uiwurerirexb jeqvad Description Fmur lan oxbrvu mzx, E abpxcay Jvmffabza qdxwfaou eb vmjsad.xdz, eb ...
- 文件断点续传原理与实现—— ESFramework 通信框架4.0 进阶(12)
在ESFramework通信框架 4.0 快速上手(13) -- 文件传送,如此简单一文的详细介绍和ESFramework通信框架 4.0 快速上手(14) -- 聊天系统Demo,增加文件传送功能( ...