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 ...
随机推荐
- Documention
Object.bool Does the object exist? Object.name Components share the same name with the game object a ...
- LINQ To SQL 处理 DateTime?
LINQ To SQL 处理 DateTime? 类型 例子: 搜索栏含有最后扫描时间的日期(DateTime?)与多个其他条件(String) 现在需要写一个查询 : 查询符合最后扫描的日期的查询 ...
- @@identity的用法
问题描述:两张表,比如说A表和B表.A表中的id为自增的,B表中的id为外键,插入时不能为空. 解决办法: 用select @@identity得到上一次插入记录时自动产生的ID,将@@identit ...
- Linux服务器建站基础-选择何种配置和安装环境项目
我们准备在搬瓦工笔记中,边整理和分享利用Linux VPS建站过程的同时,也会分享关于用户在选择和使用VPS服务器以及网站管理运营中的一些心得和建议.经常有很多网友在很多主机论坛.QQ群众问道,有没有 ...
- NYIST OJ 题目20 吝啬的王国
DFS水题.题意说明了这是一颗树,那么只要按照根节点DFS下去就好了,DFS的时候记录一下当前在哪个结点,还有父节点是谁,就AC了! #include<cstdio> #include&l ...
- 两种为wangEditor添加拖拽调整高度的方式:CSS3和jQuery UI
wangEditor是一款优秀的Web富文本编辑器,但如果能像KindEditor那样支持拖拽调整高度就更好了.有两种方式可以为wangEditor添加这一功能,这里使用的wangEditor版本为2 ...
- 真实代理(RealProxy)在WCF中的运用
在WCF中,当我们在调用服务端的方法时,一般有两点需要考虑:1.捕获服务端的异常信息,记录日志:2.及时关闭会话信道,当调用超时或调用失败时及时中断会话信道.我们一般会像下面这样处理(以Calcula ...
- GIAC全球互联网架构大会——互联网技术架构未来
GIAC全球互联网架构大会是高可用架构技术社区推出的面向架构师.技术负责人及高端技术从业人员的技术架构大会.中国拥有全球最大的互联网用户及移动互联网用户,如何使用合适的架构来搭建互联网系统,是每一个互 ...
- Web程序和应用程序服务器[转]
转自:http://hi.baidu.com/lclkathy/blog/item/dae3be36763a47370b55a970.html 一 常见的WEB服务器和应用服务器 在UNIX和LINU ...
- hdu_5969_最大的位或(贪心)
题目链接:hdu_5969_最大的位或 题意: 中文,还是自己看 题解: xjb贪心一下就行了 #include<bits/stdc++.h> #define F(i,a,b) for(i ...