这道题也算是厉害了,改了整整俩小时最后发现是深信的LCA打错了,悲伤啊!信仰崩塌了!

顺便复习LCA,给出模板

void init(){//p[i][j]表示i节点2^j的祖先
	int j;
	for(j=0;(1<<j)<=n;j++)
		pos(i,1,n)
			p[i][j]=-1;
	pos(i,1,n)
		p[i][0]=fa[i];
	for(j=1;(1<<j)<=n;j++)
		pos(i,1,n)
			if(p[i][j-1]!=-1)
				p[i][j]=p[p[i][j-1]][j-1];//i的2^j祖先即为2^(j-1)祖先的2^(j-1)祖先
}
int lca(int a,int b){
	int i;
	if(dep[a]<dep[b]) swap(a,b);//深度深的先爬
	for(i=0;(1<<i)<=dep[a];i++);
	i--;
	for(int j=i;j>=0;j--)
		if(dep[a]-(1<<j)>=dep[b])
			a=p[a][j];//爬到等高
	if(a==b) return a;//如果在一条链上,直接返回
	for(int j=i;j>=0;j--){
		if(p[a][j]!=-1&&p[a][j]!=p[b][j]){
			a=p[a][j];b=p[b][j];//两边一起爬,直到爬到LCA
		}
	}
	return fa[a];
}

这道题的题解是这样的:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
#define N 101000
int n,m;
struct haha{
	int next,to;
}edge[N*2];
int head[N],cnt=1;
void add(int u,int v){
	edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;
}
int dep[N],fa[N],size[N];
int p[N][22];
void dfs(int x){
	size[x]=1;
	for(int i=head[x];i;i=edge[i].next){
		int to=edge[i].to;
		if(fa[x]!=to){
			fa[to]=x;dep[to]=dep[x]+1;
			dfs(to);size[x]+=size[to];
		}
	}
}
void init(){//p[i][j]表示i节点2^j的祖先
	int j;
	for(j=0;(1<<j)<=n;j++)
		pos(i,1,n)
			p[i][j]=-1;
	pos(i,1,n)
		p[i][0]=fa[i];
	for(j=1;(1<<j)<=n;j++)
		pos(i,1,n)
			if(p[i][j-1]!=-1)
				p[i][j]=p[p[i][j-1]][j-1];//i的2^j祖先即为2^(j-1)祖先的2^(j-1)祖先
}
int lca(int a,int b){
	int i;
	if(dep[a]<dep[b]) swap(a,b);//深度深的先爬
	for(i=0;(1<<i)<=dep[a];i++);
	i--;
	for(int j=i;j>=0;j--)
		if(dep[a]-(1<<j)>=dep[b])
			a=p[a][j];//爬到等高
	if(a==b) return a;//如果在一条链上,直接返回
	for(int j=i;j>=0;j--){
		if(p[a][j]!=-1&&p[a][j]!=p[b][j]){
			a=p[a][j];b=p[b][j];//两边一起爬,直到爬到LCA
		}
	}
	return fa[a];
}
int get(int x,int anc,int num){
	int i;
	for(i=0;(1<<i)<=dep[x];i++);
	i--;
	for(int j=20;j>=0;j--)
		if(dep[x]-(1<<j)>=dep[anc]+num)
			x=p[x][j];
	return x;
}
int main(){
	//freopen("date.in","r",stdin);
	//freopen("date.out","w",stdout);
	scanf("%d",&n);
	pos(i,1,n-1){
		int x,y;scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	dfs(2);//cout<<fa[2];
	init();
	scanf("%d",&m);//system("pause");
	pos(i,1,m){
		int x,y;scanf("%d%d",&x,&y);
		int anc=lca(x,y);
		int dis=dep[x]+dep[y]-2*dep[anc];//cout<<dis<<endl;
		if(dis%2==1){
			printf("0\n");continue;
		}
		if(x==y){
			printf("%d\n",n);continue;
		}
		if(dep[x]==dep[y]){
			int p1=get(x,anc,1),p2=get(y,anc,1);
			printf("%d\n",n-size[p1]-size[p2]);
			continue;
		}
		if(dep[x]<dep[y]) swap(x,y);
		int p1=get(x,x,-dis/2),p2=get(x,p1,1);
		printf("%d\n",size[p1]-size[p2]);
	}
	return 0;
}

[NOIP模拟赛]约会date LCA(顺便填坑)的更多相关文章

  1. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  2. CH Round #55 - Streaming #6 (NOIP模拟赛day2)

    A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...

  3. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  4. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  5. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  6. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  7. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  8. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  9. NOIp模拟赛二十八

    (这是NOIp模拟赛?应该是NOI模拟赛不小心加了个p) 嗯,假装这是正经的NOIp模拟赛,从今天开始也写写题解吧(这几天被虐的惨惨) 今日情况:8+50+0=58 A题输出样例,B题正解写挂,C题不 ...

随机推荐

  1. Spring MVC使用样例

    Spring MVC使用样例 步骤1:添加Spring的相关依赖 1 <dependency> 2 3 <groupId>com.alibaba.external</gr ...

  2. 使用react-router setRouteLeaveHook的钩子函数

    今天在使用react-router setRouteLeaveHook的钩子函数,不知道怎么实验就是成功.最后功夫不负有心人,终于让我找到使用setRouteLeaveHook的方法了 1.我在网络上 ...

  3. 【Android Developers Training】 105. 显示一个位置地址

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 10.解决VUEX刷新的时候出现数据消失

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...

  5. 使用CodeDOM动态编译一个字符串表达式

    由于程序需要,计算的表达式使用字符串传输,这样对运算造成了影响.在程序中直接执行这段表达式可以得到值, 但是使用字符串就没有办法运算了, 所以想到用CodeDOM将这段字符串拼接在代码中编译 类似st ...

  6. JVM总结之GC

    哪些内存需要回收 在Java堆中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要知道哪些对象还"存活着",哪些对象已经"死去". 引用计数 ...

  7. Linux进阶命令-sort、uniq、 cut、sed、grep、find、awk

    命令难度总体来说有简入难,参数都是工作中常常用到的.如果涉及到一些生僻的参数还请百度或man一下. sort(参考学习网站:http://www.cnblogs.com/dong008259/arch ...

  8. 《javascript高级程序设计》笔记七

    第五章 引用类型(三) 今天首先说的就是Function类型.下面就是定义函数的两种方法,第一种使用函数声明语法定义,第二种使用函数表达式定义.这两种定义函数的方式几乎没有什么区别. function ...

  9. Java Web - HTML 常用标签和符号

    1.Html 注释,pre,&lt,&gt,&nbsp,超级链接,marquee,img标签 <html> <head> <title>常用 ...

  10. smarty模板基本语法

    smarty基本语法: 1.注释:<{* this is a comment *}>,注意左右分隔符的写法,要和自己定义的一致. <{* I am a Smarty comment, ...