【块状树】【LCA】bzoj1787 [Ahoi2008]Meet 紧急集合
分块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 紧急集合的更多相关文章
- bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...
- BZOJ1787 [Ahoi2008]Meet 紧急集合 【LCA】
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3578 Solved: 1635 [Submi ...
- bzoj1787 [Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2272 Solved: 1029 [Submi ...
- BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树.接下来m次询问(m≤500000),每次 ...
- [bzoj1787][Ahoi2008]Meet 紧急集合(lca)
传送门 可以看出,三个点两两之间的lca会有一对相同,而另一个lca就是聚集点. 然后搞搞就可以求出距离了. ——代码 #include <cstdio> #include <cst ...
- BZOJ1787 [Ahoi2008]Meet 紧急集合[结论题]
location. 求到树上三点距离和最短的点及此距离. 这个不还是分类讨论题么,分两类大情况,如下图. 于是乎发现三个点对的lca中较深的那个lca是答案点.距离就是两两点对距离加起来除以2即可.这 ...
- 【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 ...
- LCA 【bzoj1787】[Ahoi2008]Meet 紧急集合
LCA [bzoj1787][Ahoi2008]Meet 紧急集合 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1787 注意到边权为一 ...
- BZOJ 1787: [Ahoi2008]Meet 紧急集合( 树链剖分 )
这道题用 LCA 就可以水过去 , 但是我太弱了 QAQ 倍增写LCA总是写残...于是就写了树链剖分... 其实也不难写 , 线段树也不用用到 , 自己YY一下然后搞一搞就过了...速度还挺快的好像 ...
随机推荐
- poj 1523 割点 tarjan
Description Consider the two networks shown below. Assuming that data moves around these networks on ...
- TCP ------ TCP创建服务器中出现的套接字
在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...
- hbase监控实现
目前实现的监控概览
- hadoop删除节点和添加节点
从hadoop移除机器把需要移除的机器增加到exclueds文件中,强制刷新datanode列表,等待decommission 状态正常后,即可停机下架,如有必要在namenode执行balancer ...
- php SPL四种常用的数据结构
1.栈[先进后出] $stack = new SplStack(); $stack->push('data1'); $stack->push('data2'); $stack->pu ...
- 取消eslint对指定代码进行代码检测
eslint配置了不允许使用alert,但是有个需求需要用到. //eslint-disable-next-line alert('测试'); 如上,即可跳过当前行代码检查了
- 【JAVA】Eclipse中使用git进行pull远程代码
当使用eclipse或者MyEclipse进行pull远程代码的时候,或者github的代码的时候报如下错误代码: 代表我们没有配置我们的Git地址,这里我教大家配置一下.首先下面是错误代码: The ...
- jquery——通过name属性查找元素
Js代码 : $("div[id]") 选择所有含有id属性的div元素 $("input[name='newsletter']") 选择所有的name属性 ...
- 美团网技术团队分享的MySQL索引及慢查询优化教程
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...
- C语言ASM汇编内嵌语法
转载:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html C语言ASM汇编内嵌语法 .3 GCC Inline ASM G ...