传送门(bzoj)

传送门(洛谷)

可以说这道也是一个板子题

由于题中是三个人需经过的路径最短

就会有一点点不太一样

那么

就两两求LCA

这样之后就会出现两种状况

一、所得到的三个LCA是相等的

  那毫无疑问真正的LCA的值就是这个值

二、若不是第二种情况

  那必然会出现

  有且仅有一个LCA的值与令两个LCA的值不同

第二种情况正确性(不严格的)证明:

显然1和2的LCA是4

2和3的LCA是5

1和3的LCA也是5

既然2和3的LCA(5)的深度4大

那么也可把2和3的LCA看作是4和3的LCA

那么1和3的LCA也是5了

所以必定会有两个LCA是相同的

而且相同的那个一定是最高的

(因为 4和3的LCA是5 = 1和3的LCA是5 同时2 和3的LCA是5)

所以

找到了两个相同的

真正的LCA就是另一个

因为让3从5走到4

显然要比让1和2一起4走到5

同样都是要走4和5之间的相同的路径

只是方向不同而已

让1和2两个人一起走显然要比只要3走到长

所以真正的LCA是(与另外两个相同的LCA)不同的那个LCA,而不是相同的LCA了

然而当我信心满满写完的时候

我有sd了

需要减掉(即重复加到结果中的)被我简简单单的认为只是真正的LCA的深度*3

但是显然不是的啊

那这把是不是好了捏?

然而我输出的数不对啊

这可怎么回事??

我方了

(在各种瞎调试之下)

我把每一个处理fa[ ][ ]数组的循环次数从20加到的25

奇迹般地好了

(这是为什么,明明样例数据很小的啊,怎么会影响到的呢??)

跪求大佬们指点

这把终于过样例了

于是我开开心心的去提交了

结果re了

(又一脸懵)

于是我发现我sd的fa[ ][ ]数组忘再开大一点了

而且

由于是起初是无向图

所以

需要正反都要加边

但是我的数组只是一次加边的大小

既然就gg了

什么时候可以不犯这种低级错误啊qwq...

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = ;
int hed[maxn * ],nxt[maxn * ],to[maxn * ],dep[maxn * ];
bool vis[maxn];
int fa[maxn][];
int n,m,cnt,rot;
inline int read()
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= )+= ch - '';
ch = getchar();
}
return sum * p;
}
void add(int x,int y)
{
nxt[++cnt] = hed[x];
to[cnt] = y;
hed[x] = cnt;
}
void dfs(int o,int k)
{
dep[o] = dep[k] + ;
for(int i = ;i<= ;i++)
fa[o][i+] = fa[fa[o][i]][i];
for(int i = hed[o];i;i = nxt[i])
{
if(to[i] == k)
continue;
fa[to[i]][] = o;
dfs(to[i],o);
}
}
int lca(int x,int y)
{
if(dep[x] < dep[y])
swap(x,y);
for(int i = ;i >= ;i--)
{
if(dep[fa[x][i]] >= dep[y])
x = fa[x][i];
if(x == y)
return x;
}
for(int i = ;i >= ;i--)
{
if(fa[x][i] != fa[y][i])
{
x = fa[x][i];
y = fa[y][i];
}
}
return fa[x][];
}
int main()
{
n = read(),m = read();
for(int i = ;i < n;i++)
{
int a = read(),b = read();
add(a,b);
add(b,a);
vis[b] = ;
}
for(int i = ;i <= n;i++)
{
if(!vis[i])
{
rot = i;
break;
}
}
dep[rot] = ;
dfs(rot,);
for(int i = ;i <= m;i++)
{
int a = read(),b = read(),c = read();
int o = lca(a,b);
int p = lca(c,b);
int q = lca(a,c);
int u;
if(o == p)
u = q;
else
if(o == q)
u = p;
else
u = o;
printf("%d %d\n",u,dep[a] + dep[b] + dep[c] - dep[o] - dep[p] - dep[q]);
}
return ;
}

bzoj-1787-洛谷-4281(LCA板子题)的更多相关文章

  1. BZOJ 1832、1787 洛谷 4281 [AHOI2008]紧急集合

    [题解] 题目要求找到一个集合点,使3个给定的点到这个集合点的距离和最小,输出集合点的编号以及距离. 设三个点为A,B,C:那么我们可以得到Dis=dep[A]+dep[B]+dep[C]-dep[L ...

  2. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  3. 洛谷 SP14932 LCA - Lowest Common Ancestor

    洛谷 SP14932 LCA - Lowest Common Ancestor 洛谷评测传送门 题目描述 A tree is an undirected graph in which any two ...

  4. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  5. 洛谷 P2220 [HAOI2012]容易题 数论

    洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...

  6. Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化

    https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...

  7. BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings

    以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...

  8. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  9. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

随机推荐

  1. CentOS-7.2安装Ambari-2.6.1

    CentOS-7.2安装Ambari-2.6.1 一.Ambari 是什么? Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目, ...

  2. ngx-moment汉化

    1.导入汉化文件 import '../../../node_modules/moment/locale/zh-cn.js' 2.使用汉化 <span>{{item.time|amLoca ...

  3. leetcode-38.报数

    leetcode-38.报数 题意 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 ...

  4. Pycharm启动后加载anaconda一直updating indices造成Pycharm闪退甚至电脑崩溃

    可能跟anaconda文件夹有一定关系 网上找找解决方案,似乎很多人有同样的困扰! 知乎-pycharm启动后总是不停的updating indices...indexing? stackoverfl ...

  5. java笔记----JVM内存

    运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器 虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配. 堆区  ...

  6. JAVA多线程的问题以及处理(一)【转】

    多线程编程为程序开发带来了很多的方便,但是也带来了一些问题,这些问题是在程序开发过程中必须进行处理的问题. 这些问题的核心是,如果多个线程同时访问一个资源,例如变量.文件等,时如何保证访问安全的问题. ...

  7. Greenplum hostname和address不一致导致配置文件无法加载

    最近又遇到了几个坑,逐一记录分析下. 1.主机名hostname和address不一致 在又一次部署压测环境交由测试组进行压测时,同事修改了pg_hba.conf文件重新加载配置文件时报错.(找不到l ...

  8. 单线程泵问题(com操作时间超过60s报错)

    CLR   无法从   COM   上下文   0x197bf0   转换为   COM   上下文   0x197a80,这种状态已持续   60  秒.拥有目标上下文/单元的线程很有可能执行的是非 ...

  9. c/c++ 标准库 迭代器(iterator)

    c/c++ 标准库 迭代器 begin和end运算符返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator:如果对象不是常量,返回iteraotor 1 ...

  10. NPOI 笔记

    前言 文档:http://npoi.codeplex.com/documentation 示例:https://npoi.svn.codeplex.com/svn/ 下载:https://www.nu ...