hdu 2586 欧拉序+rmq 求lca
题意:求树上任意两点的距离
先说下欧拉序
对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用
这里先说第一个作用 求lca
对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之间肯定包含他们的lca,因为欧拉序1上任意两点之间肯定包含从第一个点走到第二个点访问的路径上的所有点
所以只需要记录他们的深度,然后从两个询问子节点x,y第一次出现的位置之间的深度最小值即可,可能不大好理解,看张图吧。
也就是说求lca可以转换为求一段区间的最值问题,结合rmq就可以处理啦
对于2586这题有个结论:树上任意两个点的距离等于两个点到根的距离之和减去2倍lca到根的距离
上代码
:
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
struct node
{
int x;
ll cost;
};
vector<node> edge[];
ll dis[];// 到根节点的距离
int dep[];
int ver[];// 欧拉序列
int first[];// 在欧拉序中第一次出现的位置
int vret;//
int n,m;
int mn[][];
void dfs(int x,int fa,int deep) // 求出欧拉序 以及每个点对应的度
{
ver[++vret]=x;
first[x]=vret;
dep[vret]=deep;
int len=edge[x].size();
for(int i=;i<len;i++)
{
node temp=edge[x][i];
if(temp.x!=fa)
{
dis[temp.x]=dis[x]+temp.cost;
dfs(temp.x,x,deep+);
ver[++vret]=x;
dep[vret]=deep; //
}
}
}
void st(int n)// 维护的是欧拉序 长度需要注意一下
{
int temp=(int)floor(log2(double(n)));
for(int i=;i<=n;i++) mn[i][]=i;// 注意一下 这里维护的是点 不是单纯的值
for(int j=;j<=temp;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
int a=mn[i][j-];
int b=mn[i+(<<(j-))][j-];
if(dep[a] < dep[b]) mn[i][j]=a;
else mn[i][j]=b;
}
}
}
int rmq(int x,int y)
{
int k=(int)(log(double(y-x+))/log(2.0));
int a=mn[x][k];
int b=mn[y-(<<k)+][k];
if(dep[a] < dep [b]) return a;
else return b;
}
int lca(int x,int y)
{
int fx=first[x];
int fy=first[y];
if(fx>fy) swap(fx,fy);
return rmq(fx,fy);
}
void init()
{
vret=;
dis[]=;
for(int i=;i<=n;i++) edge[i].clear();
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();// edge
scanf("%d %d",&n,&m);
for(int i=;i<n;i++)
{
int x,y;
ll cost;
scanf("%d %d %lld",&x,&y,&cost);
node temp;
temp.cost=cost;
temp.x=x;
edge[y].push_back(temp);
temp.x=y;
edge[x].push_back(temp);
} dfs(,,);//
st(*n-); for(int i=;i<=m;i++)
{
int x,y;
cin>>x>>y;
int temp=lca(x,y);// point
cout<<dis[x]+dis[y]-*dis[temp]<<endl;
}
}
return ;
}
hdu 2586 欧拉序+rmq 求lca的更多相关文章
- P3379 【模板】最近公共祖先(LCA)(欧拉序+rmq)
P3379 [模板]最近公共祖先(LCA) 用欧拉序$+rmq$维护的$lca$可以做到$O(nlogn)$预处理,$O(1)$查询 从这里剻个图 #include<iostream> # ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
- dfs序+RMQ求LCA详解
首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...
- HDU 2586(LCA欧拉序和st表)
什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...
- Bzoj 2286 & Luogu P2495 消耗战(LCA+虚树+欧拉序)
题面 洛谷 Bzoj 题解 很容易想到$O(nk)$的树形$dp$吧,设$f[i]$表示处理完这$i$颗子树的最小花费,同时再设一个$mi[i]$表示$i$到根节点$1$路径上的距离最小值.于是有: ...
- dfs序和欧拉序
生命不息,学习不止,昨天学了两个算法,总结一下,然而只是略懂,请路过的大佬多多谅解. 一.dfs序 1.什么是dfs序? 其实完全可以从字面意义上理解,dfs序就是指一棵树被dfs时所经过的节点的 ...
- RMQ求LCA
题目链接 rmq求LCA,interesting. 一直没有学这玩意儿是因为CTSC的Day1T2,当时我打的树剖LCA 65分,gxb打的rmq LCA 45分... 不过rmq理论复杂度还是小一点 ...
- LCA-RMQ+欧拉序
还是那一道洛谷的板子题来说吧 传送门 其实好几天之前就写了 结果dr实在是太弱了 没有那么多的精力 于是就一直咕咕咕了 哎 今天终于补上来了 LCA概念传送门 RMQ传送门 这个算法是基于RMQ和欧拉 ...
- BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交
题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道.机智 ...
随机推荐
- CMD命令打包文件夹成jar
网上的很多例子都是直接将在dos界面下输入jar命令出现的帮助信息给贴上了.不明白的人根本看不懂.当然我也看不懂,好在自己试了好多遍,终于成功了.现在我就根据我刚刚的操作来说明一下. 我介绍的是将一个 ...
- 解决Wireshark安装Npcap组件失败
解决Wireshark安装Npcap组件失败 从Wireshark 3.0开始,Npcap取代Winpcap组件,成为Wireshark默认的网卡核心驱动.由于该组件属于驱动程序,所以安装时候容易 ...
- Docs-.NET-C#-指南-语言参考-关键字-值类型:struct
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:struct 1.返回顶部 1. struct(C# 参考) 2015/07/20 struct 类型是一种值类型,通常用来封 ...
- shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容
shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容 删除命令对照表 命令 含义 1d 删除第一行内容 ,10d 删除1行到10行的内容 ,+5d 删除10行到16行的内容 /p ...
- 将一个多表关联的条件查询中的多表通过 create select 转化成一张单表的sql、改为会话级别临时表 【我】
将一个多表关联的条件查询中的多表通过 create select 转化成一张单表的sql 将结果改为创建一个会话级别的临时表: -- 根据下面这两个sql CREATE TABLE revenu ...
- MySQL插入大批量数据时报错“The total number of locks exceeds the lock table size”的解决办法
事情的原因是:我执行了一个load into语句的SQL将一个很大的文件导入到我的MySQL数据库中,执行了一段时间后报错"The total number of locks exceeds ...
- 迅速生成项目-vue-nuxtjs
一.介绍nuxtjs 后端渲染开源库. 参考链接:https://nuxtjs.org/guide 语言:js 模版:vue 二.从脚手架生成项目(方案A) 推荐指数:
- npm 全局安装路径 在哪里
注意:在Admin下,需要把隐藏文件显示出来,才能找到对应的文件路径.
- web端自动化——Python的smtplib发送电子邮件
SMTP (Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. Python的smtplib模块提 ...
- bootstrap-switch:记一次很坑的问题(连续相同状态的多行数据只有第一个显示按钮,其他行没有开关初始化)
先上截图,第234行都是禁用状态,但是只有第2行显示了禁用开关,后面的都没有开关初始化 检查下代码: onLoadSuccess: function(data){ {#获取行数据的状态#} conso ...