卧薪尝胆,厚积薄发。
AHOI2008 紧急集合
Date: Fri Sep 14 09:06:50 CST 2018 In Category: NoCategory

Description:

给一棵树,每次选三个点,问到这三个点距离之和最小的点。
$1\le n,q\le 500000$

Solution:

首先这个点一定在其中两个点在树上的路径上,根据中位数最优模型,这个点只能在中位数,也就是三个点的交点的位置,可以三个点两两求 $LCA$ ,答案必有两个相同的,剩下那一个就是答案。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<cstring>
using namespace std;
inline int read()
{
register int res = 0;
register char c = getchar();
while(!isdigit(c))c = getchar();
while(isdigit(c))
{
res = (res << 1) + (res << 3) + c - '0';
c = getchar();
}
return res;
}
int n,q;
#define MAXN 500010
struct edge
{
int to,nxt;
}e[MAXN << 1];
int edgenum = 0;
int lin[MAXN] = {0};
void add(int a,int b)
{
++edgenum;e[edgenum].to = b;e[edgenum].nxt = lin[a];lin[a] = edgenum;
++edgenum;e[edgenum].to = a;e[edgenum].nxt = lin[b];lin[b] = edgenum;
return;
}
int fa[MAXN],dep[MAXN],son[MAXN],siz[MAXN],top[MAXN];
void dfs1(int k,int depth)
{
dep[k] = depth;siz[k] = 1;
for(int i = lin[k];i != 0;i = e[i].nxt)
{
if(e[i].to != fa[k])
{
fa[e[i].to] = k;
dfs1(e[i].to,depth + 1);
if(son[k] == 0 || siz[e[i].to] > siz[son[k]])
{
son[k] = e[i].to;
}
}
}
return;
}
void dfs2(int k,int tp)
{
top[k] = tp;
if(son[k] == 0)return;
dfs2(son[k],tp);
for(int i = lin[k];i != 0;i = e[i].nxt)
{
if(e[i].to != fa[k] && e[i].to != son[k])
{
dfs2(e[i].to,e[i].to);
}
}
return;
}
int LCA(int a,int b)
{
while(top[a] != top[b])
{
if(dep[top[a]] < dep[top[b]])swap(a,b);
a = fa[top[a]];
}
return (dep[a] < dep[b] ? a : b);
}
int dis(int a,int b)
{
return dep[a] + dep[b] - 2 * dep[LCA(a,b)];
}
int main()
{
scanf("%d%d",&n,&q);
int a,b,c;
for(int i = 1;i < n;++i)
{
a = read();b = read();
add(a,b);
}
dfs1(1,1);dfs2(1,1);
int lca[4];
for(int i = 1;i <= q;++i)
{
a = read();b = read();c = read();
lca[1] = LCA(a,b);lca[2] = LCA(a,c);lca[3] = LCA(b,c);
int ans;
if(lca[1] == lca[2])ans = lca[3];
if(lca[2] == lca[3])ans = lca[1];
if(lca[1] == lca[3])ans = lca[2];
printf("%d %d\n",ans,dis(a,ans) + dis(b,ans) + dis(c,ans));
}
return 0;
}
In tag: 树-LCA
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡