传送门

多组询问,问到树上两个点x,y距离相等的点的个数。

倍增求lca.

//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<ctime>
const int maxn=1e5+;
typedef long long LL;
using namespace std;
int n,m,ecnt,fir[maxn],nxt[maxn<<],to[maxn<<],f[maxn][],R[maxn],sz[maxn];;
void add(int u,int v) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}
void dfs(int x,int fa) {
R[x]=R[fa]+;
f[x][]=fa;
sz[x]=;
for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
dfs(to[i],x);
sz[x]+=sz[to[i]];
}
}
void make_st() {
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
f[j][i]=f[f[j][i-]][i-];
}
int lca(int x,int y) {
if(R[x]<R[y]) swap(x,y);
for(int i=;i>=;i--)
if(R[f[x][i]]>=R[y]) x=f[x][i];
if(x==y) return x;
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i]) {
x=f[x][i];
y=f[y][i];
}
return f[x][];
}
int cal(int x,int y) {
if(x==y) return sz[];
int z=lca(x,y);
if(R[x]==R[y]) {
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i]) {
x=f[x][i];
y=f[y][i];
}
return sz[]-sz[x]-sz[y];
}
int l=R[x]-R[z]+R[y]-R[z];
if(l&) return ; l>>=;
if(R[x]<R[y]) swap(x,y);
l=R[x]-R[z]-l+;
for(int i=;i>=;i--)
if(R[f[x][i]]&&R[f[x][i]]-R[z]>=l)
x=f[x][i];
return sz[f[x][]]-sz[x];
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++) {
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
dfs(,);
make_st();
scanf("%d",&m);
for(int i=;i<=m;i++) {
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",cal(x,y));
}
return ;
}

cf519E的更多相关文章

  1. CF519E A and B and Lecture Rooms

    最近很颓……难题想不动……水题写不对,NOIP怕是

随机推荐

  1. golang中time包的使用

    一.代码 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间点 ...

  2. SQLServer 中存储过程

    SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)存储过程有三种返回:   1.   用return返回数字型数据   2.   用返回参数 ...

  3. 获取一个数组(vector)与查找值(value)的差最小绝对值的成员索引的算法

    代码如下: 函数作用:传递进来一个数组(vector),和一个需要查找的值(value),返回与value的差值绝对值最小的vector成员索引,若value不在vector范围中,则返回-1: in ...

  4. 本地项目通过 git 同步到 github

    1. github创建仓库并克隆仓库地址 2. 在本地通过git命令:git clone <仓库地址> 生成github仓库文件夹 3. 将本地项目复制到该文件夹 4. 通过git命令:g ...

  5. 面试系列18 rediscluster 原理

    一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间 ...

  6. Programming | 变量名的力量

    命名准则 变量名要完全,准确的描述变量所代表的事物,一般而言,对变量的描述就是最佳的变量名.避免x,temp,i等泛泛而谈的变量名. 比如对于矩阵的循环,matrix[row][col]就比m[i][ ...

  7. webservice、httpClient、dubbo的区别

    在开发中,对于同一个war包中的对象方法我们可以直接调用,但是很多情况下需要在不同项目或者不同服务器进行相互调用 webservice webservice技术可以实现不同服务器项目直接的调用和交换数 ...

  8. javascript特效源码(2、图像特效)

    1.不停闪烁的图像 不停闪烁的图片[修改显示的图片及链接地址后根据说明进行共1步] 1.以下代码放在一个新建页面的HTML的<body></body> 区即可:[页面上必须什么 ...

  9. cycloneii LAB-wide signals

    8 available LAB-width signals - 2 clocks - 2 clock enables - 2 asynchronous clears // - 1 asynchrono ...

  10. 洛谷P3376【模板】网络最大流 ISAP

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...