bzoj1832
其实这道题是和bzoj1787一样的
但我用bzoj1787MLE了,于是正好练一下树上倍增
type node=record
po,next:longint;
end; var w:array[..] of node;
anc:array[..,..] of longint;
dep,fa,p:array[..] of longint;
v:array[..] of boolean;
t,len,x,y,z,a,b,c,i,n,m:longint; procedure add(x,y:longint);
begin
inc(len);
w[len].po:=y;
w[len].next:=p[x];
p[x]:=len;
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure dfs(x:longint);
var i,y:longint;
begin
v[x]:=true;
i:=p[x];
while i<> do
begin
y:=w[i].po;
if not v[y] then
begin
fa[y]:=x;
dep[y]:=dep[x]+;
dfs(y);
end;
i:=w[i].next;
end;
end; procedure prework;
var i,j,h:longint;
begin
fillchar(anc,sizeof(anc),);
h:=;
for i:= to n do
begin
anc[i,]:=fa[i];
if dep[i]>h then h:=dep[i];
end;
t:=trunc(ln(h)/ln());
for j:= to t do
for i:= to n do
begin
b:=anc[i,j-];
if anc[b,j-]<>- then anc[i,j]:=anc[b,j-];
end;
end; function lca(x,y:longint):longint;
var i,p:longint;
begin
if dep[x]<dep[y] then swap(x,y);
if dep[x]<>dep[y] then
begin
p:=trunc(ln(dep[x])/ln());
for i:=p downto do
if dep[x]- shl i>=dep[y] then
begin
x:=anc[x,i];
if dep[x]=dep[y] then break;
end;
end; if x=y then exit(y);
p:=trunc(ln(dep[x])/ln());
for i:=p downto do
if (anc[x,i]<>-) and (anc[x,i]<>anc[y,i]) then
begin
x:=anc[x,i];
y:=anc[y,i];
end;
exit(fa[x]);
end; begin
readln(n,m);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
fa[]:=-;
dfs();
prework;
for i:= to m do
begin
readln(x,y,z);
a:=lca(x,y);
b:=lca(x,z);
c:=lca(y,z);
if a=b then
writeln(c,' ',dep[y]+dep[z]-*dep[c]+dep[c]+dep[x]-*dep[lca(x,c)])
else if a=c then
writeln(b,' ',dep[x]+dep[z]-*dep[b]+dep[b]+dep[y]-*dep[lca(y,b)])
else if b=c then
writeln(a,' ',dep[x]+dep[y]-*dep[a]+dep[a]+dep[z]-*dep[lca(z,a)])
end;
end.
bzoj1832的更多相关文章
- 【bzoj1787】&【bzoj1832】[Ahoi2008]Meet 紧急集合 & 聚会
bzoj1787就是bzoj1832 bzoj1832 空间和时间少了一些... 求三个结点到一个结点距离之和最小的结点以及距离和 求出两两lca,其中有两个相同,答案则为另一个 感觉就是一大暴力.. ...
- bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...
- bzoj1832: [AHOI2008]聚会--LCA
本来觉得这是一道挺水的题目,后来觉得出题人挺变态的= = 半个小时敲完后,内存超限它给我看TLE,还是0ms,后来才发现内存限制64m 然后卡了一个小时后AC了.. 题目大意是在一棵树上找三点的最短路 ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ1832 聚会
Description:Y岛风景美丽宜人,气候温和,物产丰富.Y岛上有N个城市,有N-1条城市间的道路连接着它们.每一条道路都连接某两个城市.幸运的是,小可可通过这些道路可以走遍Y岛的所有城市.神奇的 ...
- 【LCA】BZOJ1832 & BZOJ1787(AHOI)-集会
[题目大意] 一个图有n个点n-1条边(也就是说是一棵树),求其中三点共同到达某一点经过总共的最少边数以及共同到达的那一点. [思路] 借用一下黄学长给的结论:三个点两两取LCA,其中必有两个相同,则 ...
- 题解 [BZOJ1832][AHOI2008] 聚会
题面 解析 首先对于其中的两个点\(x,y\)最近的点显然就是他们的\(lca\)(我们把它设为\(p1\)), 然后考虑第三个点\(z\)与\(p1\)的\(lca,p2\). 有以下几种情况: \ ...
- 【BZOJ】1832: [AHOI2008]聚会
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...
- BZOJ题目(持续更新)
bzoj1009:kmp想法+递推+矩阵快速幂.很好的想法,考虑用长串去kmp匹配短串,dp[i][j]表示匹配指针分别指在i.j位置时候,前i位母字符串一共有多少种可能性,那么dp[i][j]=Σd ...
随机推荐
- 新建oracle数据库表空间
1.新建表空间,注意是数据表空间,不是临时表空间 create tablespace CARD logging datafile 'C:\app\tablespace\CARD.DBF' //注 ...
- 微信分组群发图文40152,微信分组群发图文invalid group id hint
微信分组群发40152,微信分组群发invalid group id hint >>>>>>>>>>>>>>> ...
- Membership角色与权限管理
安全性:成员资格与角色:验证与授权. 一.建数据库:在VS工具中用DOS环境执行ASPNET_REGSQL 二.配置程序访问数据库: > 在web.config之中加入 <connecti ...
- Child&ElementChild
关于firstChild&firstElementChild及其同类属性使用,同时分析不同浏览器下child的包含的节点差异 <head> <meta charset=&qu ...
- ie6常见的兼容性
1.IE6怪异解析之padding与border算入宽高 原因:未加文档声明造成非盒模型解析 解决方法:加入文档声明<!doctype html> 2.IE6在块元素.左右浮动.设定mar ...
- javascript 用函数实现“继承”
一.知识储备: 1.枚举属性名称的函数: (1)for...in:可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性) (2)Object.keys():返回数组(可枚举的自有属性) ( ...
- jQuery慢慢啃之ajax(九)
1.jQuery.ajax(url,[settings])//通过 HTTP 请求加载远程数据 如果要处理$.ajax()得到的数据,则需要使用回调函数.beforeSend.error.dataFi ...
- [C#学习]在多线程中如何调用Winform[转]
问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如 ...
- 图标字体的使用(fontello.com)字体推荐及使用技巧
网页设计中为了页面漂亮好看,图标是少不了,网页中使用的图标通常都是使用图片,使用图片图标的有很多弊端,如果你经常制作网页应该有一肚子埋怨. 使用图片图标的弊端 放大图标必须重新作图, 改变颜色必须开启 ...
- dotnet core多平台开发体验
前言 随着net core rc2的发布,园子里面关于net core的入门文章也也多了起来,但是大多数都是在一个平台上面来写几个简单的例子,或者是在解释代码本身,并没有体现说在一个平台上面创建一个项 ...