分块LCA什么的,意外地快呢……

就是对询问的3个点两两求LCA,若其中两组LCA相等,则答案为第三者。

然后用深度减一减什么的就求出距离了。

 #include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 500001
struct Graph
{int v[maxn<<],first[maxn<<],next[maxn<<],w[maxn<<],en;
void AddEdge(const int &a,const int &b)
{v[++en]=b;next[en]=first[a];first[a]=en;}}G;
int dep[maxn],fa[maxn],top[maxn],siz[maxn],x,y,z,sz,n,m;
int Abs(const int &x){return x< ? (-x) : x;}
int Res,Num;char C,CH[];
inline int R()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
inline void P(long long x)
{
Num=;if(!x){putchar('');return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
}
void makeblock(int cur)
{
for(int i=G.first[cur];i;i=G.next[i])
if(G.v[i]!=fa[cur])
{
dep[G.v[i]]=dep[cur]+;
fa[G.v[i]]=cur;
if(siz[top[cur]]<sz)
{
siz[top[cur]]++;
top[G.v[i]]=top[cur];
}
makeblock(G.v[i]);
}
}
inline int QLCA(int u,int v)
{
while(u!=v)
{
if(top[u]==top[v])
{
if(dep[u]<dep[v]) swap(u,v);
u=fa[u];
}
else
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
}
return u;
}
int main()
{
n=R();m=R();
for(int i=;i<n;i++)
{
x=R();y=R();
G.AddEdge(x,y);
G.AddEdge(y,x);
}
for(int i=;i<=n;i++) {top[i]=i; siz[i]=;}
sz=sqrt((double)n*5.0); makeblock();
for(;m>;m--)
{
x=R();y=R();z=R();
int f1=QLCA(x,y),f2=QLCA(x,z),f3=QLCA(y,z);
if(f1==f2)
{
int f4=QLCA(x,f3); P(f3); putchar(' ');
P(Abs(dep[f3]-dep[y])+Abs(dep[f3]-dep[z])
+Abs(dep[f4]-dep[x])+Abs(dep[f4]-dep[f3])); puts("");
}
else if(f1==f3)
{
int f4=QLCA(y,f2); P(f2); putchar(' ');
P(Abs(dep[f2]-dep[x])+Abs(dep[f2]-dep[z])
+Abs(dep[f4]-dep[y])+Abs(dep[f4]-dep[f2])); puts("");
}
else
{
int f4=QLCA(z,f1); P(f1); putchar(' ');
P(Abs(dep[f1]-dep[x])+Abs(dep[f1]-dep[y])
+Abs(dep[f4]-dep[z])+Abs(dep[f4]-dep[f1])); puts("");
}
}
return ;
}

【块状树】【LCA】bzoj1787 [Ahoi2008]Meet 紧急集合的更多相关文章

  1. bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会

    bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...

  2. BZOJ1787 [Ahoi2008]Meet 紧急集合 【LCA】

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3578  Solved: 1635 [Submi ...

  3. bzoj1787 [Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2272  Solved: 1029 [Submi ...

  4. BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树.接下来m次询问(m≤500000),每次 ...

  5. [bzoj1787][Ahoi2008]Meet 紧急集合(lca)

    传送门 可以看出,三个点两两之间的lca会有一对相同,而另一个lca就是聚集点. 然后搞搞就可以求出距离了. ——代码 #include <cstdio> #include <cst ...

  6. BZOJ1787 [Ahoi2008]Meet 紧急集合[结论题]

    location. 求到树上三点距离和最短的点及此距离. 这个不还是分类讨论题么,分两类大情况,如下图. 于是乎发现三个点对的lca中较深的那个lca是答案点.距离就是两两点对距离加起来除以2即可.这 ...

  7. 【BZOJ1787】[Ahoi2008]Meet 紧急集合 LCA

    [BZOJ1787][Ahoi2008]Meet 紧急集合 Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 ...

  8. LCA 【bzoj1787】[Ahoi2008]Meet 紧急集合

    LCA [bzoj1787][Ahoi2008]Meet 紧急集合 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1787 注意到边权为一 ...

  9. BZOJ 1787: [Ahoi2008]Meet 紧急集合( 树链剖分 )

    这道题用 LCA 就可以水过去 , 但是我太弱了 QAQ 倍增写LCA总是写残...于是就写了树链剖分... 其实也不难写 , 线段树也不用用到 , 自己YY一下然后搞一搞就过了...速度还挺快的好像 ...

随机推荐

  1. poj3133 Manhattan Wiring

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2016   Accepted: 1162 ...

  2. HDU4370:0 or 1(最短路)

    0 or 1 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 Description: Given a n*n matrix Cij (1< ...

  3. Avito Cool Challenge 2018 A. B题解

    A. Definite Game 题目链接:https://codeforces.com/contest/1081/problem/A 题意: 给出一个数v,然后让你可以重复多次减去一个数d,满足v% ...

  4. 自定义orderBy字母函数

    orderedUsers: function () { var arr = this.users; for (var i = 0; i < arr.length - 1; i++) { for ...

  5. oracle12c创建用户等问题

    一:前言 这几天我重新装了下电脑,然后自己有试着去装了下oracle11g,结果还是失败了然后我自己又去下载了最新的oracle12c,oracle12c中有两个用户sys和system,scott已 ...

  6. Liberty中应用的contextroot

    参考:http://www-01.ibm.com/support/knowledgecenter/api/content/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ ...

  7. 【Foreign】开锁 [概率DP]

    开锁 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 4 5 1 2 5 4 3 1 5 ...

  8. 「6月雅礼集训 2017 Day2」B

    [题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...

  9. NYOJ 38 布线问题 (最小生成树 prim)

    题目链接 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测 ...

  10. python脚本运行的几种方式

    1.脚本式编程 将如下代码拷贝至 hello.py文件中: print ("Hello, Python!"); 通过以下命令执行该脚本: $ python ./hello.py h ...