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. JS强制关闭浏览器页签并且不提示关闭信息

    工作中很多奇葩的需求都会出现,现在就有一个问题,描述如下: 现在的登录跳转权限页面要去掉,集成在第三方系统信息上,当退出登录的时候需要关掉打开的Tab页面,因此考虑使用window.close()关闭 ...

  2. MarkdownPad2安装与破解-转载

    MarkdownPad安装包下载链接链接:https://pan.baidu.com/s/1o7c4W7C2d8zCPh5z7y4IvQ提取码:e4bf 下载解压之后,找要MarkdownPad2.e ...

  3. (十九)SpringBoot之使用Spring Session集群-redis

    一.引入maven依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnc ...

  4. For... in 及 For… of 及 forEach

    For... in 及 For… of let arr = ["a","b"]; for (let a in arr) { console.log(a) // ...

  5. angular轮播图

    还是直接上代码比较好 <!doctype html><html lang="en"><head> <meta charset=" ...

  6. flask 反向解析示例

    1 静态网页 和动态网页 1 静态网页:无法与服务器做动态交互的网页 2 动态网页:允许与服务器做动态加护的 2 WEB 与 服务器 1 WEB :网页(HTML,css,JS) 3 服务器的作用: ...

  7. C 预编译 宏 声明

  8. Oracle 安装步骤

    目录 Oracle 安装步骤 一.安装流程 二.登录流程 三.新建数据库 四.图形化连接 Oracle 安装步骤 一.安装流程 解压oracle 11g两个压缩文件 点击安装,修改目录,新建一个文件夹 ...

  9. winform中使用缓存

    文章:Winform里面的缓存使用 另外一篇文章:缓存-MemoryCache Class

  10. L1与L2正则化

    目录 过拟合 结构风险最小化原理 正则化 L2正则化 L1正则化 L1与L2正则化 参考链接 过拟合 机器学习中,如果参数过多.模型过于复杂,容易造成过拟合. 结构风险最小化原理 在经验风险最小化(训 ...