cf519E
多组询问,问到树上两个点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的更多相关文章
- CF519E A and B and Lecture Rooms
最近很颓……难题想不动……水题写不对,NOIP怕是
随机推荐
- VS 解决方案 Xamarin 配置
需要额外安装 Mono 程序 工具->Xamarin->Android -> SDK路径 要和 你配置的ANDROID_SDK_ROOT 的路径一至如果没有 ANDROID_SDK ...
- go操作空指针导致supervisor进程服务挂机的坑
一.起因 在数据库中直接手动插入了某条记录,但由于该记录的某个字段的空值,与另一个字段的状态码不符合,在go程序中,突然操作了该空字段的指针,导致程序panic挂机. panic: runtime e ...
- php开发面试题---php面试题英语(How do you debug a PHP application)
php开发面试题---php面试题英语(How do you debug a PHP application) 一.总结 一句话总结: xdebug or use die() do it; 1.Whi ...
- idea创建web项目,springboot项目,maven项目
web项目搭建 https://www.cnblogs.com/jxldjsn/p/8203859.html
- SPOJ694 New Distinct Substrings
New Distinct Substrings 题目大意 给定一个字符串,求本质不同的子串个数 题解 SA常见思想:每一个子串都是某个后缀的前缀 考虑每一个后缀的贡献,首先他拥有n - sa[i]个( ...
- python全栈开发:字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 %[(name ...
- Idea安装Mevn
1.下载mevn安装包. 下载地址:http://maven.apache.org/ 点击Download 2.下面这两个选哪个都可以,取决于你用什么方式解压 3.把下载好的安装包解压到一个没有中文的 ...
- 7 Serialize and Deserialize Binary Tree 序列化及反序列化二叉树
原题网址:http://www.lintcode.com/zh-cn/problem/serialize-and-deserialize-binary-tree/# 设计一个算法,并编写代码来序列化和 ...
- SpringCloud学习笔记(一):SpringCloudt相关面试题
什么是微服务? 看笔记二 微服务之间是如何独立通讯的? 服务与服务间采⽤轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API) SpringCloud和Dubbo有什么区别? Du ...
- 表单修饰符.lazy.number.trim
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...