传送门(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. element vue Array数组和Map对象的添加与删除

    使用场景: 一个后台系统中, 管理员要配置自定义字段后台要生成id和title,其他角色要使用自定义字段的表单, 添加数据, 但是每个要填写的对象的id 和title都是无法固定的,因此页面显示的ti ...

  2. C#基础(204)--对象初始化器,基本数据类型与引用数据类型特点总结,ref,out关键字的使用

    对象初始化器: 对象在创建过程中也可以使用对象初始化器完成“属性的初始化” Student stu =new Student(){ StudentId=, StudentName="张三&q ...

  3. Tomcat异常:server Tomcat v9.09 Server at localhost failed to start

    详细报错: 首先不要慌张,这不是Tomcat引发的问题.而是你自己代码错误导致的问题(小编遇到的是配置servlet-mapping时,url-pattern中配置不合法) 然后,检查控制台打印信息, ...

  4. 接口自动化 [授客]基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  5. DAY4(python)打印字符串以及增删改查

    用while循环打印字符串 #if i in s: # print ( i ) s='nanfjkhndaol' index = 0 while 1 : print (s[index]) index+ ...

  6. 上传github文件及所出现的问题

    上传github所发现的问题 准备工作 使用 git bush 输入下面的命令 git config --global user.email "you@example.com" g ...

  7. c/c++ 网络编程与多线程 编译参数

    网络编程与多线程 编译参数 编译时要链接操作系统的pthread库 g++ -g socket01.cpp -std=c++11 -pthread 不加-pthread的话,出现下面的错误: term ...

  8. c/c++ 智能指针 shared_ptr 和 new结合使用

    智能指针 shared_ptr 和 new结合使用 用make_shared函数初始化shared_ptr是最推荐的,但有的时候还是需要用new关键字来初始化shared_ptr. 一,先来个表格,唠 ...

  9. Windows7安装Bitvise开启ssh服务

    Windows7安装Bitvise开启ssh服务 by:铁乐猫 在Liunx和windows10上配置SSH服务是一件很容易的事,毕竟系统己经自带了ssh的服务功能. 不过在windows7上可不容易 ...

  10. jQuery -- 光阴似箭(三):jQuery 操作 HTML 元素和属性

    jQuery -- 知识点回顾篇(三):jQuery拥有操作 HTML 元素和属性的强大方法. 1. 获取HTML 元素的内容和属性 (1) 获得内容:  text().html() 以及 val() ...