牛客小白月赛13 小A的最短路(lca+RMQ)
链接:https://ac.nowcoder.com/acm/contest/549/F
来源:牛客网
题目描述
输入描述:
第一行一个整数N代表景区的个数。
接下来N-1行每行两个整数u,v代表从位置u到v之间有一条路径可以互相到达。
接下来的一行两个整数U,V表示这两个城市之间可以直接坐缆车到达。
接下来一行一个整数Q,表示有Q次询问。
接下来的Q行每行两个整数x,y,代表小A的位置在x,而他想要去的地方是y。
输出描述:
对于每个询问下x,y输出一个结果,代表x到y消耗的最少体力对于每个询问下x,y输出一个结果,代表x到y消耗的最少体力
输入
4
1 2
1 3
2 4
3 4
2
1 3
3 4
输出
1
0 解题思路:很明显是lca的板子题,唯一不同的就是加了一条权值为零的边而已,我们假设边x-y权值为零,需要求u-v的最小距离,dis【i,j】为i到j的最小距离,此时u-v的最小距离为min(dis【u,v】,min(dis【u,x】+dis【y,v】,dis【u,y】+dis【x,v】))了。
在这,我就简单讲一下lca的RMQ的求法吧。
两个结点的最近公共祖先的求法:

就如上面的一棵树,我们按DFS遍历一遍,把遍历到的结点加入到某个数组中可以得到一个序列:1 2 4 2 5 7 9 7 5 8 5 2 1 3 6 3 1
他们的深度依次为: 0 1 2 1 2 3 4 3 2 3 2 1 0 1 2 1 0
要查找某两个结点的最近公共祖先,即查找这这个序列中两个结点所对应的这一段的深度最小的那个结点。比如查找5和6的最近公共祖先,他们对应的结点序列为:
5 7 9 7 5 8 5 2 1 3 6,深度为
2 3 4 3 2 3 2 1 0 1 2,深度最小为1结点(深度为0)。这里可以使用RMQ来维护(当然也可以用线段树),不熟悉RMQ的可以看:传送门。(感觉讲的很渣啊。。。)
当然,求lca的还有别的方法,等以后有机会再更新吧(目前不会QAQ)。
这里贴上本题的AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define ri register int
typedef long long ll; inline ll gcd(ll i,ll j){
return j==?i:gcd(j,i%j);
}
inline ll lcm(ll i,ll j){
return i/gcd(i,j)*j;
}
inline void read(int &x){
char ch=x=;
int f=;
while(!isdigit(ch)){
ch=getchar();
if(ch=='-'){
f=-;
}
}
while(isdigit(ch))
x=x*+ch-'',ch=getchar();
x=x*f;
}
const int maxn=3e5+;
struct st1{
int to,w;
st1():to(),w(){
}
st1(int to,int w):to(to),w(w){
}
};
vector<st1> vec[maxn];
int dep[maxn];
int in[maxn*];//某个点在欧拉序第一次出现的位置
int co;
int vis[maxn];
int st[maxn*][];//存运行dfs时候的序列(好像叫欧拉序)
void dfs(int u,int cnt){
vis[u]=;
st[++co][]=u;
in[u]=co;
dep[u]=cnt;
for(int i=;i<vec[u].size();i++){
st1 tem=vec[u][i];
if(vis[tem.to]==){
dfs(tem.to,cnt+);
st[++co][]=u;
}
}
}
void getst(){
for(int i=;(<<i)<=co;i++){
for(int be=;be+(<<i)-<=co;be++){
if(dep[st[be][i-]]<dep[st[be+(<<(i-))][i-]]){
st[be][i]=st[be][i-];
}
else{
st[be][i]=st[be+(<<(i-))][i-];
}
}
}
}
int rmq(int l,int r){
int x=in[l];
int y=in[r];
if(x>y)swap(x,y);
int tem=floor(log(y-x+)/log());
int tem1=st[x][tem];
int tem2=st[y-(<<tem)+][tem];
if(dep[tem1]<dep[tem2])return tem1;
else return tem2;
}
int main(){
int n;
int u,v;
co=;
read(n);
for(int i=;i<n;i++){
read(u);read(v);
vec[u].push_back(st1(v,));
vec[v].push_back(st1(u,));
}
read(u);read(v);
int k;
dfs(,);
getst();
scanf("%d",&k);
int x,y;
for(int i=;i<k;i++){
read(x);read(y);
int ans;
ans=dep[x]+dep[y]-*dep[rmq(x,y)];
ans=min(ans,dep[x]+dep[u]-*dep[rmq(x,u)]+dep[y]+dep[v]-*dep[rmq(y,v)]);
ans=min(ans,dep[x]+dep[u]-*dep[rmq(y,u)]+dep[y]+dep[v]-*dep[rmq(x,v)]);
printf("%d\n",ans);
}
return ;
}
牛客小白月赛13 小A的最短路(lca+RMQ)的更多相关文章
- 牛客小白月赛13 小A的回文串(Manacher)
链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个 ...
- 牛客小白月赛13 小A买彩票 (记忆化搜索)
链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 牛客小白月赛13 小A的柱状图(单调栈)
链接:https://ac.nowcoder.com/acm/contest/549/H来源:牛客网 题目描述 柱状图是有一些宽度相等的矩形下端对齐以后横向排列的图形,但是小A的柱状图却不是一个规范的 ...
- 单调栈+前缀和 || Nowcoder || 牛客小白月赛13 || 小A的柱状图
题面:小A的柱状图 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> #define l ...
- 牛客小白月赛13-J小A的数学题 (莫比乌斯反演)
链接:https://ac.nowcoder.com/acm/contest/549/J来源:牛客网 题目描述 小A最近开始研究数论题了,这一次他随手写出来一个式子,∑ni=1∑mj=1gcd(i,j ...
- 牛客小白月赛6 I 公交线路 最短路 模板题
链接:https://www.nowcoder.com/acm/contest/136/I来源:牛客网 题目描述 P市有n个公交站,之间连接着m条道路.P市计划新开设一条公交线路,该线路从城市的东站( ...
- 牛客小白月赛13 G(双向搜索)
AC通道 两边同步搜,一步里面A走一次B走两次,遇到对方走过的地方就得到了答案. #include <bits/stdc++.h> using namespace std; const i ...
- 牛客小白月赛13 E(图、矩阵幂)
AC通道 如果建立第一天某点到某点有几条路的矩阵,做k次矩阵乘就是第k天某点到某点有几条路.统计即可. #include <bits/stdc++.h> using namespace s ...
- 【牛客小白月赛21】NC201605 Bits
[牛客小白月赛21]NC201605 Bits 题目链接 题目描述 Nancy喜欢做游戏! 汉诺塔是一个神奇的游戏,神奇在哪里呢? 给出3根柱子,最开始时n个盘子按照大小被置于最左的柱子. 如果盘子数 ...
随机推荐
- Java文件File类学习总结
java.io.File类 代表文件和目录,在开发中,读取文件.生成文件.删除文件.修改文件的属性都会用到该类. 常见构造方法: public File(String pathName){} 以pat ...
- Centos7下GlusterFS 分布式文件系统环境搭建
Centos7下 GlusterFS 环境搭建准备工作glusterfs-3.6.9.tar.gzuserspace-rcu-master.zip三台服务器:192.168.133.53.192.16 ...
- idea中使用github
转载:https://www.cnblogs.com/javabg/p/7987755.html 1.先安装git插件,本机安装git在C:\InstallSoftWare\Git 2. 在Idea ...
- (整理) .NET IIS性能优化
本文收集了部分性能优化的方式,缓存.压缩.线程池调整等等,仅供参考. 1 .NET 程序中的调整 程序Sqlhelper中使用缓存 使用JSON序列化器(Jil)取代Json.NET 2 .NET 程 ...
- FPM 0.08安装了打不开解决办法
今天在网上找了FPM软件下载,结果却不能打开,于是到处找资料,终于解决了,呵呵,写下来供大家学习. 用UltraEdit打开FPM.exe,查找"改为8B,F2改为00,然后保存,就可以打开 ...
- CSS3之动画模块实现轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ubuntu 下安装mulval
怎么在虚拟机下安装ubuntu这里就不多说了 ubuntu怎么安装静态ip可以参考:https://www.cnblogs.com/braveym/p/8640563.html ubuntu安装jdk ...
- Postman Could not get any response
在使用postman时遇到的小问题,记录一下: 报错信息如下: Could not get any response There was an error connecting to https:// ...
- MYSQL数据库中中文乱码问题
show variables like 'character%'; set character_set_database=gbk; 把记事本中的代码引入到mysql数据库中:source +addre ...
- pycharm同步代码到coding
代码同步coding三步曲: 1.pycharm的tips---vcs---checkout from version control---git 选择git后会弹出clone repository弹 ...