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 ...
随机推荐
- bootstrap02导航菜单
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 安卓Intent(显式)
1.Intent是Android程序中各组件之间交互的重要方式,一般可用于启动活动.启动服务.以及发送广播等场景,这里先对活动进行说明Intent的一些作用. 2.Intent的用法大致可分为,显式I ...
- php之常量小见
php设置常量有二种方法,一为define(),二为使用关键字const. define()函数带有三个形参,一为常量名,通常以大写字母命名,二为值,三为是否对大小写敏感,其值为可选,默认为false ...
- php strtotime函数服务器和本地不相同
遇到过一种情况strtotime 在本地和服务器不相同 服务器返回的是-1 strtotime($sa_sagyo_ymd."23:59:59") 如果这样用不了,就只能换一种写法 ...
- innosetup 安装静默安装msi,指定安装路径的方法
自己看了很久帮助,分号的用法确实不太好用,湿了这个东东估计很多人会用到,发出来给大家参考. Filename: "{app}/msiexec.exe";Parameters: &q ...
- Http协议、线程、线程池
Socket模拟服务端运行代码: 1:启动服务端监听的服务,并接受客户端的连接 1.1 创建Socket Socket listenSocket=new Socket(AddressFamily.In ...
- 带参数的查询防止SQL注入攻击
把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数: 参数的设 ...
- redis【摘自网上,只为以后查看】
ubuntu安装启动redis 1.下载安装 cd /tmp wget http://redis.googlecode.com/files/redis-2.2.13.tar.gz tar -zxf r ...
- mysql 刘道成视频教程 第3课
第3课: 1.mysql中条件使用关键字where: 2.查 select name,content from msg ; select name,content 控制列 where id>2 ...
- DOM对象与Jquery对象区别