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 ...
随机推荐
- python修炼6
文件操作 注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法. 1.打开文件 (相当于桌面的快捷方式)f=open(文件名,模式默 ...
- 客户端socket调用
import java.net.Socket; import java.io.*; import java.util.Scanner; import java.util.regex.Pattern; ...
- jfinal获取服务器的IP和端口
String serverIp = getRequest().getServerName(); Integer serverPort = getRequest().getServerPort();
- 完全删除Postgresql
First: If your install isn't already damaged, you can drop unwanted PostgreSQL servers ("cluste ...
- Ubuntu 安装Composer
操作系统:Ubuntu 14.04.2 1.自动安装 $ curl -sS https://getcomposer.org/installer | php 2.更新 $ composer self-u ...
- PHP学习过程_Symfony_(2)
今天正式学习Symfony;首先推荐一篇文章"十分钟学习Symfony"(这是我们老大写的,由于那些搞seo的家伙的粘贴复制也不写出处,老大干脆把代码库给清理了,不过幸好我提前fo ...
- VC学习笔记: 1. Window程序内部运行机制
0. 内容结构 API与SDK 窗口与句柄 消息与消息队列 WinMain函数 1. API与SDK 这里 API是指由Windows操作系统提供给应用程序的编程接口: Windows系统提供的API ...
- putty命令行提交本地修改文件到git
使用putty 连接 linux服务器 ,服务器账户和密码在putty 上使用git提交.使用git账户和密码 (需要升级管理员) 01 pwd 查看当前目录print work directory0 ...
- ubuntu 14.04 GDAL
autotools-dev comerr-dev hdf5-helpers icu-devtools krb5-multidev libarmadillo4 libarpack2 libblas3 l ...
- 分库分表下uuid的生成
分库分表时一般有必要自定义生成uuid,大企业一般有自己的uuid生成服务,其他它的实现很简单.我们以订单号为例,组成可以是"业务标识号+年月日+当日自增数字格式化",如00012 ...