1558:聚会 ybt
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的更多相关文章
- BSD和云 – 不可错过的BSD聚会
自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务 (Integration S ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...
- DHV 平常语言对话 一次聚会离场
一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...
- BZOJ3170: [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 531 Solved: 249[Submit][Statu ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- tyvj1161聚会的名单(trie树)
背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description 明天就是candy的生日.晚上,c ...
- 【HDOJ】1558 Segment set
并查集+计算几何. /* 1558 */ #include <cstdio> #include <cstring> #include <cstdlib> #defi ...
随机推荐
- 解决GitHub下载慢问题,不用修改HOSTS文件
写这篇文章缘由是我用的一款Github上的软件软件版本更新,想去Github上下载新的版本,结果下载速度居然只有几k,还老是下载失败,然后去修改HOSTS文件(我看文章基本都是叫修改这个),修改完成后 ...
- (错误)启动ActiveMQ报错:Transport Connector could not be registered in JMX: java.io.IOException: Failed to bind to server socket: stomp://0.0.0.0:61613?
一.错误报告 很明显,端口被占用 二.解决方法 1. 在cmd中输入 netstat -ano 查看61613端口被占用情况,如果有其他进程使用,则使用 taskkill /f /pid 进程PID ...
- (九)Activitivi5之使用 RuntimeService 设置和获取流程变量
一.案例 /** * 设置流程变量数据 */ @Test public void setVariableValues(){ RuntimeService runtimeService=processE ...
- Abp 添加权限项<一>
1.下载代码,数据库迁移,npm install 2.添加权限项: public static class PermissionNames { public const string Pages_Te ...
- class类 - static
不需要实例化类,即可直接通过该类来调用的方法,即称之为"静态方法".将类中的方法设为静态方法也很简单,在方法前加上static关键字即可.这样该方法就不会被实例继承! class ...
- HTML中关于 浮动 的简单说明
1.首先,标签之所以有存在等级分类,是因为他们处于标准文档流(块级元素,行内元素,行内块元素)当中. 2.如何脱离标准文档流? 浮动 绝对定位 固定定位 这些可以让一个标签脱离标准文档流,而元素一旦脱 ...
- Java基础加强-jdk1.5的一些新特性
JDK 5.0 特性 1.静态导入(import static 语句导入一个类中的某个静态方法或所有静态方法) 如: import static java.lang.Math.*; 2.可变参数 1. ...
- C#基础 冒泡排序
冒泡排序 依次比较相邻的两个数,将小数放在前面,大数放在后面. 对数组中两个变量进行交换,是冒泡排序中最基本的步骤 //数组中两个变量进行交换 ,,}; ]; s [] = s [s.Length-] ...
- 火狐新版移除developer Toolbar和无法关闭自动更新的解决
随着火狐的不断更新已经更新到66版本了,近期注意到有个问题是火狐经常提示更新,更新了没多久,又时不时跳出更新的提示,不胜其烦. 在火狐的前期的版本中(大概4年之前吧)在Options菜单里是可以设置从 ...
- 问题 C: 如沫春风 ---有毒的gets(),新OJ不能用!用scanf(%s)读入即可!——ZZNU新OJ
问题 C: 如沫春风 时间限制: Sec 内存限制: MB 提交: 解决: [提交] [状态] [讨论版] [命题人:admin] 题目描述 月亮很亮,亮也没用,没用也亮. 我喜欢你,喜欢也没用,没用 ...