传送门

多组询问,问到树上两个点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. Windows route

    ROUTE [-f] [-p] [-4|-6] command [destination]                  [MASK netmask]  [gateway] [METRIC met ...

  2. golang模块viper读取配置文件

    一.介绍 Viper是一个方便Go语言应用程序处理配置信息的库.它可以处理多种格式的配置.它支持的特性: 设置默认值 从JSON.TOML.YAML.HCL和Java properties文件中读取配 ...

  3. JS继承(简单理解版)

    童鞋们,我们今天聊聊js的继承,关于继承,平时开发基本用不到,但是面试没有不考的,我就想问,这是人干的事吗? 好吧,迫于社会主义核心价值观,我们今天就来简单说一说js的继承,谁让它是面向对象编程很重要 ...

  4. [kuangbin带你飞]专题一 简单搜索 - F - Prime Path

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...

  5. Day 8 : Python 文档操作

    Python 文件的操作方法: 打开文件 f = open('test','r',encoding='utf-8') #f :文件句柄 #test:文件绝对路径 #r:打开方式 #encoding 打 ...

  6. 解决div设置浮动,高度消失

    给包围 浮动的层 加清除浮动样式,样式要兼容的用下面的代码.clearfix {*zoom:1; clear:both;}.clearfix:after{content:".";d ...

  7. MediatR 知多少 - 简书

    原文:MediatR 知多少 - 简书 引言 首先不用查字典了,词典查无此词.猜测是作者笔误将Mediator写成MediatR了.废话少说,转入正题. 先来简单了解下这个开源项目MediatR(作者 ...

  8. 在页面上显示PDF

    /// <summary> /// 读取PDF文件 /// </summary> /// <param name="fName">文件名称(可以 ...

  9. UMP系统架构 Zookeeper

  10. openSUSE 安装LAMP记录

    按照 openSUSE SDB:LAMP setup安装好了LAMP.运行的大多数命令都是来自与openSUSE SDB:LAMP setup中. 本页面描述如何安装LAMP,这是 Linux Apa ...