HDU 2586(LCA欧拉序和st表)
什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细
因为欧拉序中的两点之间,就是两点遍历的过程,所以只要找遍历过程中对应的最小的深度就行了,这里用st表存,first存第一个u出现的地方,用value存欧拉序,同时用depth存对应深度
模板
- struct node{
- int v,next,dist;
- }a[maxn<<];
- int n,m,tot,len;
- int st[maxn<<][], depth[maxn<<],value[maxn<<],first[maxn<<];
- int dist[maxn],head[maxn];
- void add(int u,int v,int dist0){
- a[tot].next=head[u];
- a[tot].dist=dist0;
- a[tot].v=v;
- head[u]=tot++;
- }
- void dfs(int u,int fa,int d) {
- value[++len]=u;depth[len]=d;first[u]=len;
- for (int i=head[u];~i;i=a[i].next){
- int v=a[i].v;if(v==fa)continue;
- dist[v]=dist[u]+a[i].dist;
- dfs(v,u,d+);
- value[++len]=u;depth[len]=d;
- }
- }
- inline void init(int n){
- for(int i=;i<=n;i++)head[i]=-,depth[i]=;
- tot=,len=;
- }
- inline void makest(){
- for(it i=;i<=len;i++)st[i][]=depth[i];
- for(it i=;<<i<=len;i++){
- for(it j=;j+(<<i)-<=len;j++){
- st[j][i]=min(st[j][i-],st[j+(<<(i-))][i-]);
- }
- }
- }
- inline int dis(int u,int v){
- int l=first[u],r=first[v];
- if(l>r){swap(l,r);}
- int k=log2(r-l+);
- int dep=min(st[l][k],st[r-(<<k)+][k]);
- return dist[u]+dist[v]-*dist[value[first[dep]]];
- }
题意:
以1为根的树,两个点之间的最近距离是多少
思路:
模板LCA
用欧拉序+st表
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define il inline
- #define it register int
- #define inf 0x3f3f3f3f
- #define lowbit(x) (x)&(-x)
- #define mem(a,b) memset(a,b,sizeof(a))
- #define modd 998244353
- const int maxn=4e4+;
- struct node{
- int v,next,dist;
- }a[maxn<<];
- int n,m,tot,len;
- int st[maxn<<][], depth[maxn<<],value[maxn<<],first[maxn<<];
- int dist[maxn],head[maxn];
- void add(int u,int v,int dist0){
- a[tot].next=head[u];
- a[tot].dist=dist0;
- a[tot].v=v;
- head[u]=tot++;
- }
- void dfs(int u,int fa,int d) {
- value[++len]=u;depth[len]=d;first[u]=len;
- for (int i=head[u];~i;i=a[i].next){
- int v=a[i].v;if(v==fa)continue;
- dist[v]=dist[u]+a[i].dist;
- dfs(v,u,d+);
- value[++len]=u;depth[len]=d;
- }
- }
- inline void init(int n){
- for(int i=;i<=n;i++)head[i]=-,depth[i]=;
- tot=,len=;
- }
- inline void makest(){
- for(it i=;i<=len;i++)st[i][]=depth[i];
- for(it i=;<<i<=len;i++){
- for(it j=;j+(<<i)-<=len;j++){
- st[j][i]=min(st[j][i-],st[j+(<<(i-))][i-]);
- }
- }
- }
- inline int dis(int u,int v){
- int l=first[u],r=first[v];
- if(l>r){swap(l,r);}
- int k=log2(r-l+);
- int dep=min(st[l][k],st[r-(<<k)+][k]);
- return dist[u]+dist[v]-*dist[value[first[dep]]];
- }
- int main(){
- int t;
- scanf("%d",&t);
- while(t--){
- scanf("%d%d",&n,&m);
- init(n);
- for(it i=;i<n-;i++){int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- add(u,v,w);add(v,u,w);
- }
- dfs(,,);
- makest();
- while(m--){
- int l,r;
- scanf("%d%d",&l,&r);
- printf("%d\n",dis(l,r));
- }
- }
- return ;
- }
用倍增
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define il inline
- #define it register int
- #define inf 0x3f3f3f3f
- #define lowbit(x) (x)&(-x)
- #define mem(a,b) memset(a,b,sizeof(a))
- #define modd 998244353
- const int maxn=4e4+;
- struct node{
- int v,next,dist;
- }a[maxn<<];
- int n,m,tot;
- int fath[maxn][], depth[maxn];
- int dist[maxn],head[maxn];
- void add(int u,int v,int dist0){
- a[tot].next=head[u];
- a[tot].dist=dist0;
- a[tot].v=v;
- head[u]=tot++;
- }
- void dfs(int u,int fa,int d) {
- fath[u][]=fa; depth[u]=d;
- for(int i=;i<;i++) fath[u][i]=fath[fath[u][i-]][i-];
- for (int i=head[u];~i;i=a[i].next){
- int v=a[i].v;if(v==fa)continue;
- dist[v]=dist[u]+a[i].dist;
- dfs(v,u,d+);
- }
- }
- void init(int n){
- for(int i=;i<=n;i++)fath[i][]=,dist[i]=,head[i]=-,depth[i]=;
- tot=;
- }
- inline int lca(int x,int y){
- if(depth[x]<depth[y])swap(x,y);
- int h=depth[x]-depth[y];
- for(it i=;h>;i++){
- if(h&){
- x=fath[x][i];
- }
- h>>=;
- }
- if(x==y)return x;
- for(it i=;i>=;i--){
- if(fath[x][i]!=fath[y][i]){
- x=fath[x][i];
- y=fath[y][i];
- }
- }
- return fath[x][];
- }
- inline int dis(int u,int v){
- int d=lca(u,v);
- return dist[u]+dist[v]-*dist[d];
- }
- int main(){
- int t;
- scanf("%d",&t);
- while(t--){
- scanf("%d%d",&n,&m);
- init(n);
- for(it i=;i<n-;i++){int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- add(u,v,w);add(v,u,w);
- }
- dfs(,,);
- while(m--){
- int l,r;
- scanf("%d%d",&l,&r);
- printf("%d\n",dis(l,r));
- }
- }
- return ;
- }
HDU 2586(LCA欧拉序和st表)的更多相关文章
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
- HDU - 4548-美素数 (欧拉素数筛+打表)
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数&quo ...
- hdu 2586 欧拉序+rmq 求lca
题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...
- 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈
[BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
- Bzoj 2286 & Luogu P2495 消耗战(LCA+虚树+欧拉序)
题面 洛谷 Bzoj 题解 很容易想到$O(nk)$的树形$dp$吧,设$f[i]$表示处理完这$i$颗子树的最小花费,同时再设一个$mi[i]$表示$i$到根节点$1$路径上的距离最小值.于是有: ...
- P3379 【模板】最近公共祖先(LCA)(欧拉序+rmq)
P3379 [模板]最近公共祖先(LCA) 用欧拉序$+rmq$维护的$lca$可以做到$O(nlogn)$预处理,$O(1)$查询 从这里剻个图 #include<iostream> # ...
- dfs序和欧拉序
生命不息,学习不止,昨天学了两个算法,总结一下,然而只是略懂,请路过的大佬多多谅解. 一.dfs序 1.什么是dfs序? 其实完全可以从字面意义上理解,dfs序就是指一棵树被dfs时所经过的节点的 ...
- LCA-RMQ+欧拉序
还是那一道洛谷的板子题来说吧 传送门 其实好几天之前就写了 结果dr实在是太弱了 没有那么多的精力 于是就一直咕咕咕了 哎 今天终于补上来了 LCA概念传送门 RMQ传送门 这个算法是基于RMQ和欧拉 ...
- [BZOJ3772]精神污染 主席树上树+欧拉序
3772: 精神污染 Time Limit: 10 Sec Memory Limit: 64 MB Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位 ...
随机推荐
- swagger2使用
添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swag ...
- nginx 简单理解和配置
1.概念 Nginx是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是由伊戈尔·塞索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一 ...
- PP: Tripoles: A new class of relationships in time series data
Problem: ?? mining relationships in time series data; A new class of relationships in time series da ...
- Docker学习一篇就够了
Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像 ...
- Python标准库之sys模块
获取Python解释器的版本信息 import sys print(sys.version) #输出 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) ...
- Response与ServletContext对象
HTTP协议: 请求消息:客户端发送给服务器端的数据 数据格式: 请求行: 格式: 请求方式 请求url 请求协议/版本 请求头:告诉服务器,当前访问的浏览器自身的一些信息 格式: 请求头名称: 请求 ...
- (原创)SpringBoot入门
本文章是SpringBoot入门的介绍在这里 我会尽量写一些细节性的东西,我用的是IDEA2016 Tomcat7 JDK1.8 Maven3.3.9 IDEA Tomcat JDK Maven ...
- 环境配置 | mac环境变量文件.bash_profile相关
每次环境配置都费老劲,零零碎碎的知识就记在这里 文件:~/.bash_profile
- jQuery操作css
jQuery addClass() 方法 向被选中元素添加class属性,参数为属性值 $("div").addClass("imp"); 也可以同时向多个元素 ...
- Allegro 反射仿真--仿真设置
一.打开BRD文件 打开PCB SI,启动Cadence Product Choices界面,如图1-1所示,一般我们选择Allegro PCB SI 630(SPECCTRAQuest),具体如下图 ...