分块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. 解决mysql的日志文件过大的问题

    https://www.2cto.com/database/201203/122984.html

  2. AWS CLI command example

    1.list ec2 instance-id, instance status, type, ip address, name aws ec2 describe-instances --query ' ...

  3. ppk和pem证书互转

    首先你得去下载个putty pem:通用证书格式 ppk:为putty下面的专有格式     pem->ppk 直接通过putty下的puttygen.exe 选的Load private ke ...

  4. 转:Linux下使用Nginx搭建简单图片服务器

    最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的,今天再这里简单讲一下Nginx实现上传图片以及图片服务器的大致理念. 如果是个人项目或者企业小项目,仅 ...

  5. jquery中的get和post、ajax有关返回值的问题描述

    一:前言 今天我就要离开公司回学校准备考试,在走之前,我自己做的一个模块测试除了一些小的bug.问题如下 我在往数据库中插入数据,首先要选择一级菜单,接着会更具一级菜单生成一级菜单的子目录,在选择日期 ...

  6. GDSOI2015的某道题目

    分析: 看到这个$3^i$就觉得很奇怪的样子...为什么一定要是$3^i$...而且不能重复使用... 不能重复使用就代表不会产生进位,那么一定是若干个$3^i$相加减的式子... 仔细观察,我们发现 ...

  7. 【poj3294-不小于k个字符串中最长公共子串】后缀数组

    1.注意每两个串之间的连接符要不一样. 2.分组的时候要注意最后一组啊!又漏了! 3.开数组要考虑连接符的数量.100010是不够的至少要101000. #include<cstdio> ...

  8. bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版

    这道题写法和之前差不多 但是fhqtreap在加点的时候为了同时维护大根堆以及二叉排序树的性质所以插入时也要注意分裂 fhqteap需要判断指针是否为空 不然就会re 这个我调了很久 #include ...

  9. 愚蠢的LCAAAAA~~~~(>_<)~~~~

    很愤怒!特别愤怒!超级愤怒!!! 我LCA居然错了!!而且是那种特别愚蠢的错误 我把代码都交错了!!! silasila 话不多说,代码上特别详细了 #include<bits/stdc++.h ...

  10. CentOS 7 主机加固手册-下

      CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x1f 删除禁用非必要的服务 删除非必要的服务 # Remove yum remove ...