1558:聚会 ybt 题解(看似很难,其实要是摸清了实质这就是个大水题)

上题目

1558:聚会

时间限制: 1000 ms         内存限制: 524288 KB
提交数: 82     通过数: 56

【题目描述】

原题来自:AHOI 2008

Y


岛风景美丽宜人,气候温和,物产丰富。Y 岛上有 N 个城市,有 N−1 条城市间的道路连接着它们。每一条道路都连接某两个城市。幸运的是,小可可通过这些道路可以走遍 Y

岛的所有城市。神奇的是,乘车经过每条道路所需要的费用都是一样的。

小可可,小卡卡和小 YY

经常想聚会,每次聚会,他们都会选择一个城市,使得三个人到达这个城市的总费用最小。

由于他们计划中还会有很多次聚会,每次都选择一个地点是很烦人的事情,所以他们决定把这件事情交给你来完成。他们会提供给你地图以及若干次聚会前他们所处的位置,希望你为他们的每一次聚会选择一个合适的地点。

【输入】

第一行两个正整数,N


和 M

。分别表示城市个数和聚会次数;

后面有 N−1


行,每行用两个正整数 A 和 B 表示编号为 A 和编号为 B 的城市之间有一条路。城市的编号是从 1 到 N

的;

再后面有 M


行,每行用三个正整数表示一次聚会的情况:小可可所在的城市编号,小卡卡所在的城市编号以及小 YY

所在的城市编号。

【输出】

一共有 M


行,每行两个数 P 和 C,用一个空格隔开。表示第 i 次聚会的地点选择在编号为 P 的城市,总共的费用是经过 C

条道路所花费的费用。

【输入样例】

6 4
1 2
2 3
2 4
4 5
5 6
4 5 6
6 3 1
2 4 4
6 6 6

【输出样例】

5 2
2 5
4 1
6 0

【提示】

数据范围与提示:

40% 的数据中,1≤N,M≤2×103

100% 的数据中,1≤N,M≤5×105

乍一看这道题正常人的脑子里都会想到最短路 在不看这一节的标题的情况下

但是这道题的本质却是找规律。。。。在纸上画一画就很容易想到

我们分别找出这三个点的LCA,会发现三个LCA当中必有两个相同的点(可以数学证明但是我不会)

而最终要去的那个点就是除了上述两点之外的第三个点

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+;
int n,m,tot;
int next[N<<],head[N<<],f[N<<][],Dep[N<<],to[N<<]; inline int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
} inline void Add(int from,int pos)
{
next[++tot]=head[from];
head[from]=tot;
to[tot]=pos;
} inline void Pre(int u,int fa)
{
Dep[u]=Dep[fa]+;
f[u][]=fa;
for(int i=;i<=;i++)
f[u][i]=f[f[u][i-]][i-];
for(int i=head[u];i;i=next[i])
{
if(to[i]==fa) continue;
//dis[to[i]]=dis[u]+1;
Pre(to[i],u);
}
} inline int LCA(int x,int y)
{
if(Dep[x]<Dep[y]) swap(x,y);
for(int i=;i>=;i--)
{
if(Dep[f[x][i]]>=Dep[y]) x=f[x][i];
if(x==y) return x;
}
for(int i=;i>=;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][];
} inline int Q(int x,int y)
{
return (Dep[x]+Dep[y]-*Dep[LCA(x,y)]);
} inline int query(int x,int y,int z,int end)
{
return (Q(x,end)+Q(y,end)+Q(z,end));
}
int main()
{
n=read();m=read();
int x,y,z;
int A,B,C;
for(int i=;i<n;i++)
{
x=read();y=read();
Add(x,y);
Add(y,x);
}
Pre(,);
for(int i=;i<=m;i++)
{
x=read();y=read();z=read();
A=LCA(x,y);
B=LCA(x,z);
C=LCA(y,z);
if(A==B) printf("%d %d\n",C,query(x,y,z,C));
else if(A==C) printf("%d %d\n",B,query(x,y,z,B));
else printf("%d %d\n",A,query(x,y,z,A));
}
return ;
}

1558:聚会 ybt的更多相关文章

  1. BSD和云 – 不可错过的BSD聚会

    自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务 (Integration S ...

  2. 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2259  Solved: 1023[Submit] ...

  3. bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)

    题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...

  4. DHV 平常语言对话 一次聚会离场

    一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...

  5. BZOJ3170: [Tjoi 2013]松鼠聚会

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 531  Solved: 249[Submit][Statu ...

  6. bzoj1832: [AHOI2008]聚会

    写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  7. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  8. tyvj1161聚会的名单(trie树)

    背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description     明天就是candy的生日.晚上,c ...

  9. 【HDOJ】1558 Segment set

    并查集+计算几何. /* 1558 */ #include <cstdio> #include <cstring> #include <cstdlib> #defi ...

随机推荐

  1. 夯实基础:彻底搞清楚Cookie 和 Session 关系和区别(转)

    原文地址:http://www.sohu.com/a/281228178_120047080 网络请求中的cookie与set-Cookie的交互模式和作用:https://my.oschina.ne ...

  2. CSS3中三种清除浮动(float)影响的方式

    float是HTML中布局的一大关键,很多难题一旦用上float都能很愉快地解决.但是凡是好用的,也容易出错.比如当子元素都为float时,其父元素会受影响,或者偶尔会发现自己某个div的高度变成了0 ...

  3. 作业16:java枚举类的秘密

    JAVA代码 public enum EnumTest { HELLO,WORLD } 字节码 public final class EnumTest extends java.lang.Enum&l ...

  4. Java容器汇总【红黑树需要再次学习】

    1,概述 2,Collection 2.1,Set[接触比较少] 2.1.1 TreeSet 底层由TreeMap实现 基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作.但是查找效率不如 ...

  5. Nginx Too many open files

    2019/07/25 08:31:31 [crit] 15929#15929: accept4() failed (24: Too many open files) 2019/07/25 08:31: ...

  6. INTEL_BIOS 编译—for-ATOM_E3800

    INTEL_BIOS 编译—for-ATOM_E3800 ======================================================================= ...

  7. Java代理模式示例程序

    Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...

  8. sql 给相同属性的数据排序

    UPDATE b SET OrderIndex = a.OrderIndex FROM ( SELECT RTRIM(ROW_NUMBER() OVER ( PARTITION BY [ItemID] ...

  9. PowerBulider获取计算机mac地址

    PowerBulider获取计算机mac地址 1.下载GETNET.DLL获取网络资源的API 2.PB的全局函数中的引入需要API,常用API列表如下 //得到计算机名字 function bool ...

  10. MySQL数字类型int与tinyint、float与decimal如何选择

    最近在准备给开发做一个mysql数据库开发规范方面培训,一步一步来,结合在生产环境发现的数据库方面的问题,从几个常用的数据类型说起. int.tinyint与bigint 它们都是(精确)整型数据类型 ...