Description

Z市交通不发达,所有公交路线覆盖的边竟然一个环也不包含,甚至该市的公交路线有可能会分为几个互不连通的块,这可真是不可思议。有一天,你突然听到一条消息,说你的M个同学被困在了Z市里,他们分别要从他们当前所在的点ai移动到他们想去的点bi.于是你立刻调集资料,了解了Z市的形状和公交路线的分布,现在你要算出每个人到达目的地最少要换多少次车,或者告知那个人不能仅用公交车达到目的地。

Solution

首先最优走法是经过 \(lca\) 的,那么刚开始肯定是尽量往上走

于是预处理出 \(f[x][i]\) 表示点 \(x\) 往上转车 \(2^i\) 次可以达到的最小深度

\(x,y\) 先都尽可能往上跳,然后讨论经过 \(lca\) 的情况,要么在 \(lca\) 处转车,要么有经过 \(lca\) 直达的路线

我们判断一下是否有直达路线即可,实际上就是查找是否存在路径的两个端点分别在 \(x,y\) 的子树内,主席树维护一下就好了

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=1e4+10;
int n,m,Q,head[N],nxt[N*2],to[N*2],num=0,L[N],R[N],DFN=0,dep[N],fa[N][19];
int f[N][19],b[N],rt[N],tt=0;vector<int>S[N];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void dfs(int x){
b[L[x]=++DFN]=x;
for(int j=1;j<=18;j++)fa[x][j]=fa[fa[x][j-1]][j-1];
for(int i=head[x],u;i;i=nxt[i]){
if(L[u=to[i]])continue;
fa[u][0]=x;dep[u]=dep[x]+1;dfs(u);
}
R[x]=DFN;
}
inline int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
int deep=dep[x]-dep[y];
for(int i=18;i>=0;i--)if(deep>>i&1)x=fa[x][i];
if(x==y)return x;
for(int i=18;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
struct data{int ls,rs,w;}tr[N*20];
inline void ins(int &x,int l,int r,int sa){
tr[++tt]=tr[x];x=tt;tr[x].w++;
if(l==r)return ;
int mid=(l+r)>>1;
if(sa<=mid)ins(tr[x].ls,l,mid,sa);
else ins(tr[x].rs,mid+1,r,sa);
}
inline int qry(int x,int l,int r,int sa,int se){
if(sa<=l && r<=se)return tr[x].w;
int mid=(l+r)>>1;
if(se<=mid)return qry(tr[x].ls,l,mid,sa,se);
if(sa>mid)return qry(tr[x].rs,mid+1,r,sa,se);
return qry(tr[x].ls,l,mid,sa,mid)+qry(tr[x].rs,mid+1,r,mid+1,se);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int x,y,z,ans=0;
cin>>n>>m>>Q;
for(int i=1;i<n;i++)gi(x),gi(y),link(x,y),link(y,x);
dfs(1);
for(int i=1;i<=n;i++)f[i][0]=i;
for(int i=1;i<=m;i++){
gi(x);gi(y);z=lca(x,y);
if(dep[z]<dep[f[x][0]])f[x][0]=z;
if(dep[z]<dep[f[y][0]])f[y][0]=z;
if(L[x]>L[y])swap(x,y);
S[L[x]].push_back(L[y]);
}
for(int i=1;i<=n;i++){
rt[i]=rt[i-1];
for(int j=S[i].size()-1;j>=0;j--)ins(rt[i],1,n,S[i][j]);
}
for(int i=n;i>=1;i--){
x=b[i];
if(dep[f[x][0]]<dep[f[fa[x][0]][0]])f[fa[x][0]][0]=f[x][0];
}
for(int j=1;j<=18;j++)
for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
while(Q--){
gi(x);gi(y);z=lca(x,y);ans=0;
if(x==y){puts("0");continue;}
for(int i=18;i>=0;i--){
if(dep[f[x][i]]>dep[z])x=f[x][i],ans+=1<<i;
if(dep[f[y][i]]>dep[z])y=f[y][i],ans+=1<<i;
}
if((f[x][0]==x && x!=z)||(f[y][0]==y && y!=z)){puts("-1");continue;}
if(x==z || y==z){printf("%d\n",ans);continue;}
if(L[x]>L[y])swap(x,y);
printf("%d\n",ans+1-(bool)(qry(rt[R[x]],1,n,L[y],R[y])-qry(rt[L[x]-1],1,n,L[y],R[y])));
}
return 0;
}

bzoj 2167: 公交车站的更多相关文章

  1. springboot整合jsp,完成公交车站路线图

    转: springboot整合jsp,完成公交车站路线图 点赞再看,养成习惯 开发环境: jdk 8 intellij idea tomcat 8 mysql 5.7 maven 3.6 所用技术: ...

  2. BZOJ2167 : 公交车站

    设$f[i]$表示$i$往上通过一趟公交车能到达的深度最小的祖先,这可以通过将公交车按$lca$深度从小到大排序后用并查集染色得到. 对于每个询问: $1.x==y$ $ans=0$. $2.x$是$ ...

  3. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ 2004 Bus 公交线路(矩阵)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2004 题意:小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依 ...

  6. bzoj 2004: [Hnoi2010]Bus 公交线路

    Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...

  7. 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route

    题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...

  8. BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)

    第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...

  9. BZOJ 1266: [AHOI2006]上学路线route

    题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:"很 ...

随机推荐

  1. Spring Boot - Spring Scheduling

    有时应用需要定时(如凌晨)执行一些任务(比如计算一些数据并存下来留给后续使用) 使用 使用@EnableScheduling注解启用Scheduling功能:不一定要标注在启动类上,也可以标注在@Co ...

  2. select2 多选设置默认值

    Select2  version 4.0.3  https://select2.github.io   <select id="slroles" ng-model=" ...

  3. POST or GET?

    在web2.0时代,很多网站不再是枯燥的静态页面,也不是那种加上让用户填写一些表单的简单页面.它们已经功能复杂的应用程序.本文,着重改善这些web应用程序出现的问题中的get和post.针对不同需求的 ...

  4. FPN(feature pyramid networks)

    多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确:高层的特征语义信息比较丰富,但是目标位置比较粗略.另外虽然也有些算法采用多尺度 ...

  5. 洛谷P5205 【模板】多项式开根(FFT)

    题面 传送门 题解 考虑分治 假设我们已经求出\(A'^2\equiv B\pmod{x^n}\),考虑如何计算出\(A^2\equiv B\pmod{x^{2n}}\) 首先肯定存在\(A^2\eq ...

  6. vue-cli中的webpack打包配置

    如下: assetsSubDirectory: 'static', assetsPublicPath: '/projectName/', 其中assetsSubDirectory是代表服务器上的实际路 ...

  7. weex 自定义Modul

    扩展iOS的功能 一. 新建 NSOjbect 子类, 并遵循协议<WXModuleProtocol> .h 代码 #import <Foundation/Foundation.h& ...

  8. css属性详解和浮动

    一.CSS属性组成和作用 属性:属性值 1)每个css样式都必须由两部分组成:选择符和声明 注:声明又包括属性和属性值 2)css属性:属性是指定选择符具有的属性,他是css的核心,css2共有150 ...

  9. JAVA static深入了解

    static关键字: 1)static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享:2)只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的 ...

  10. SD与SE的关系,以及异常值

    很多刚进入实验室的同学对实验数据的标准差(SD)与标准误(SE)的含义搞不清,不知道自己的数据报告到底该用SD还是SE.这里对这两个概念进行一些介绍. 标准差(SD)强调raw data的Variat ...