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 ...
随机推荐
- 怎样解决Chrome浏览器因为禁止音频自动播放所造成的视频无法自动播放且报错: Uncaught (in promise) DOMException的问题
这个问题是谷歌基于用户体验方面的考虑, 对页面加载时自动播放的音频作了限制, 试想一下, 如果你打开某个页面就立刻自动播放某种不可描述的声音, 那体验想必是十分酸爽. 尽管这个设定是针对音频的, 但实 ...
- B+Tree的基本介绍
概念 特点 B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用B+Tree实现其索引结构. 与B-Tree相比,B+Tree有以下不同点: 每个节点的指针上限为2d而不是2d ...
- QT实现两条贪吃蛇
Snake.pro文件 1 #------------------------------------------------- 2 # 3 # Project created by QtCreato ...
- Tensorflow 训练inceptionV4 并移植
安装brazel (请使用最新版的brazel 和最新版的tensorflow ,版本不匹配会出错!!!) 下载bazel-0.23 https://pan.baidu.com/s/1X ...
- 2019年Java后端工程师常见面试题和感想
来新公司有5个月了,从第二个月开始就参与公司后端工程师的面试工作了,包括校招在内,面试超过100个(包括40个校招的终面)应聘者了,应聘者中有超过10年的技术经理,有6年以上的高级开发,有3到5年的中 ...
- 关于Objective C的私有函数
(1)很多从其他语言(例如C++)转到objective c的初学者,往往会问到一个问题,如何定义类的私有函数?这里的“私有函数”指的是,某个函数只能在类的内部使用,不能在类的外部,或者派生类内部使用 ...
- Array+DP leetcode-11.装更多的水
11. Container With Most Water 题面 Given n non-negative integers a1, a2, ..., an , where each represen ...
- springload热更新的优缺点
java开发web应用没有.net的方便快捷, 原因是传统开发模式下新增修改代码后要查看效果, 一般要重启应用, 导致浪费了许多无谓的时间,没有.net的高效, 任意更新文件实时生效. 但是有个叫sp ...
- Ajax长连接和SignalR(刷新客户端数据)的区别
ajax实现长连接 <%@ page language="java" import="java.util.*" pageEncoding=" ...
- 用js刷剑指offer(斐波那契数列)
牛客网链接 下面介绍一下什么是斐波那契数列 js代码 知道了通项公式,那代码就非常简单了 function Fibonacci(n) { // write code here let pre = 1 ...