LOJ #10130 点的距离
在LOJ做的第一道题。
最开始想复杂了qwq 想的是在求LCA的过程中统计向上的步数
其实此题很裸……就是求出u,v的LCA,
再分别用两点深度减去LCA的深度,再加起来就好了qwq
---化简---
\(dep[u]+dep[v]-2*dep[LCA(u,v)]\)
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define MAXN 100005
using namespace std;
struct qwq
{
	int t,nex;
};
int tot=0,dep[MAXN],fa[MAXN][20],lg[MAXN],h[MAXN],n,m;
qwq e[MAXN<<1];
inline void add(int x,int y)
{
	e[++tot].t=y;
	e[tot].nex=h[x];
	h[x]=tot;
}
void dfs(int f,int fat)
{
	dep[f]=dep[fat]+1;
	fa[f][0]=fat;
	for (int i=1;(1<<i)<=dep[f];i++)
	{
		fa[f][i]=fa[fa[f][i-1]][i-1];
	}
	for (int i=h[f];i>0;i=e[i].nex)
	{
		if (e[i].t!=fat)
		{
			dfs(e[i].t,f);
		}
	}
}
int LCA(int x,int y)
{
	if (dep[x]<dep[y])
	{
		swap(x,y);
	}
	while (dep[x]>dep[y])
	{
		x=fa[x][lg[dep[x]-dep[y]]-1];
	}
	if (x==y)
	{
		return x;
	}
	for (int i=lg[dep[x]-1];i>=0;i--)
	{
		if (fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int maxn=-10;
inline void init()
{
	scanf("%d",&n);
	for (int i=1,x,y;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		maxn=max(maxn,max(x,y));
		add(x,y);
		add(y,x);
	}
	for (int i=1;i<=n;i++)
	{
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
	dfs(maxn,0);
	scanf("%d",&m);
	for (int i=1,x,y;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		int lca=LCA(x,y);
		printf("%d\n",dep[x]+dep[y]-2*dep[lca]);
	}
}
int main()
{
	init();
	return 0;
}
												
											LOJ #10130 点的距离的更多相关文章
- LOJ P10130 点的距离 题解
		
这道题相当于倍增求LCA的板子,我们只要构建一棵树,然后距离就是x的深度+y的深度 - LCA(x,y)的深度: #include<iostream> #include<cstdio ...
 - OJ题解记录计划
		
容错声明: ①题目选自https://acm.ecnu.edu.cn/,不再检查题目删改情况 ②所有代码仅代表个人AC提交,不保证解法无误 E0001 A+B Problem First AC: 2 ...
 - Loj #6073.「2017 山东一轮集训 Day5」距离
		
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
 - 【LOJ#6073】距离(主席树)
		
[LOJ#6073]距离(主席树) 题面 LOJ 题解 两点间的距离是\(dep[x]+dep[y]-2dep[LCA]\). 那么题目要求的东西拆开维护,唯一不好做的就是\(2dep[LCA]\). ...
 - loj#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 主席树)
		
题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需 ...
 - loj#6073. 「2017 山东一轮集训 Day5」距离(费用流)
		
题意 题目链接 Sol 我们可以把图行列拆开,同时对于行/列拆成很多个联通块,然后考虑每个点所在的行联通块/列联通块的贡献. 可以这样建边 从S向每个行联通块连联通块大小条边,每条边的容量为1,费用为 ...
 - LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)
		
题目链接 就是恶心人的,简单写写了...(似乎就是[HNOI2015]开店?) 拆式子,记\(dis_i\)为\(i\)到根节点的路径权值和,\(Ans=\sum dis_{p_i}+\sum dis ...
 - LOJ #6509. 「雅礼集训 2018 Day7」C
		
神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...
 - loj题目总览
		
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
 
随机推荐
- ux.form.field.Month 只能选年、月的时间扩展
			
效果如图,亲测6.2.1版本可用,用法同时间选择控件 //月弹窗扩展 //只选月 Ext.define('ux.picker.Month', { extend: 'Ext.picker.Month', ...
 - vue重要项目的参考
			
https://github.com/PanJiaChen/vue-element-admin vue项目参考 重点 https://github.com/opendigg/awesome-gith ...
 - cf954H
			
挖我自闭了这是什么东西啊. 给出一棵深度为 的树,其中深度为 的节点有 个儿子.问树上的简单路径中长度在 之间的每个有多少条. 表示对于在 层的 个节点,向下走 步的方案数 表示对于 ...
 - Java课程寒假之开发记账本软件(网页版)之二
			
一.实现基础功能之一(记账) 一个记账本最基础之一的功能就是记账,所以也是首先要解决的问题,我选择了上学期使用的MySQL数据库来对账本进行存储. 我选择记账的方法是分开记账,就是支出放在一个表,收入 ...
 - python 接口自动化测试二(request.get)
			
环境搭建好后,接下来我们先来了解一下requests的一些简单使用,主要包括: requests常用请求方法使用,包括:get,post requests库中的Session.Cookie的使用 其它 ...
 - Druid连接池(一)
			
介绍 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. 支持的数据库 Druid支持所有JDB ...
 - Python学习之旅(十)
			
Python基础知识(9):函数(Ⅰ) Python中函数的定义:是逻辑结构和过程化的一种编程方法 定义方法: def test(x): #def:定义函数的关键字 test:函数名 x:形参,也可以 ...
 - mysql日志分类
			
mysql的日志分类: (1)错误日志:记录mysql服务的启动,运行,停止mysql服务时出现的问题 [mysqld] log_error=[/path/filename] (2)通用查询日志:记录 ...
 - Java  递归获取一个路径下的所有文件,文件夹名称
			
package com.readfile; import java.io.File; public class GetAllFiles { public static void main(String ...
 - 大数据量下的集合过滤—Bloom Filter
			
算法背景 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,存储位置要么是磁盘 ...