bzoj-1787-洛谷-4281(LCA板子题)
可以说这道也是一个板子题
由于题中是三个人需经过的路径最短
就会有一点点不太一样
那么
就两两求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板子题)的更多相关文章
- BZOJ 1832、1787 洛谷 4281 [AHOI2008]紧急集合
[题解] 题目要求找到一个集合点,使3个给定的点到这个集合点的距离和最小,输出集合点的编号以及距离. 设三个点为A,B,C:那么我们可以得到Dis=dep[A]+dep[B]+dep[C]-dep[L ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
- 洛谷 SP14932 LCA - Lowest Common Ancestor
洛谷 SP14932 LCA - Lowest Common Ancestor 洛谷评测传送门 题目描述 A tree is an undirected graph in which any two ...
- 洛谷 P2791 幼儿园篮球题
洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...
- 洛谷 P2220 [HAOI2012]容易题 数论
洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...
- Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化
https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...
- BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings
以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...
- bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格
洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...
- bzoj 1014: 洛谷 P4036: [JSOI2008]火星人
题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...
随机推荐
- iphone怎么投屏到电脑屏幕上
随着苹果手机的更显换代,苹果手机的功能越来越强大,其中iphone手机更新了airplay镜像功能,所以想要手机投屏电脑的小伙伴就更加方便了,但是iphone怎么投屏到电脑呢?大家不用着急,下面即将为 ...
- Python入门基础之函数、切片
Python之函数 Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用. Python之调用函数 Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需 ...
- Mybatis使用动态代理实现拦截器功能
1.背景介绍 拦截器顾名思义为拦截某个功能的一个武器,在众多框架中均有“拦截器”.这个Plugin有什么用呢?或者说拦截器有什么用呢?可以想想拦截器是怎么实现的.Plugin用到了Java中很重要的一 ...
- Android为TV端助力 双缓存机制
废话不多说,直接贴代码! 所谓的双缓存,第一就是缓存在内存里面,第二就是缓存在SD卡里面,当你需要加载数据时,先去内存缓存中查找,如果没有再去SD卡中查找,并且用户可以自选使用哪种缓存! 缓存内存和缓 ...
- 虚拟现实的头戴式设备的视野(FOV)原理
本文原址https://www.cnblogs.com/zhangmiao14/p/5836664.html. 对于VR,它做得最好的就是它对生活的变化,有一些关键因素需要调整的恰如其分.如果做得正确 ...
- leetcode-217存在重复元素
leetcode-217存在重复元素 题意 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: ...
- telnet 测试网站是否开启长连接
测试服务器是否开启keepalive(长连接) telnet 主机名(域名|IP) 80 #发起请求GET /index.html HTTP/1.1Host: www.cbnsc.com 如果请求完后 ...
- [20190401]那个更快的疑问.txt
[20190401]那个更快的疑问.txt --//前一阵子,做了11g于10g下,单表单条记录唯一索引扫描的测试,摘要如下:--//参考链接:http://blog.itpub.net/267265 ...
- 使用html+css+js实现简易计算器
使用html+css+js实现简易计算器, 效果图如下: html代码如下: <!DOCTYPE html> <html lang="en"> <he ...
- SQL SERVER启动步骤
第一步 从注册表读取SQL SERVER启动信息 (1)Audit Level:设置SQL SERVER是否记录用户登陆信息 Login Mode:设置SQL SERVER登陆类型是只接受windo ...