bzoj 1832: [AHOI2008]聚会
良心题2333
三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233)
#include<bits/stdc++.h>
#define N 500005
#define M 10000005
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
inline int ra()
{
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;
}
struct node{
int to,next;
}e[N<<];
int head[N],cnt;
int fa[N][],deep[N],n,m;
void insert(int x, int y){e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;}
void dfs(int x)
{
for (int i=; i<=; i++)
if (deep[x]>=(<<i))
fa[x][i]=fa[fa[x][i-]][i-];
else break;
for (int i=head[x];i;i=e[i].next)
{
if (e[i].to==fa[x][]) continue;
fa[e[i].to][]=x;
deep[e[i].to]=deep[x]+;
dfs(e[i].to);
}
}
int lca(int x, int y)
{
if (deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for (int i=; (<<i)<=t ; i++)
if (t&(<<i)) x=fa[x][i];
for (int i=; i>=; i--)
if (fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
if (x==y) return x;
return fa[x][];
}
int lca_cost(int x, int y)
{
int sum=;
if (deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for (int i=; (<<i)<=t ; i++)
if (t&(<<i)) x=fa[x][i],sum+=(<<i);
for (int i=; i>=; i--)
if (fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i],sum+=(<<i)*;
if (x==y) return sum;
return sum+;
}
int main()
{
n=ra(); m=ra();
for (int i=; i<n; i++)
{
int x=ra(),y=ra();
insert(x,y); insert(y,x);
}
dfs();
for (int i=; i<=m; i++)
{
int x=ra(),y=ra(),z=ra();
int ans1=lca_cost(x,y)+lca_cost(lca(x,y),z);
int ans2=lca_cost(x,z)+lca_cost(lca(x,z),y);
int ans3=lca_cost(y,z)+lca_cost(lca(y,z),x);
int ans=min(min(ans1,ans2),ans3);
if (ans==ans1) printf("%d ",lca(x,y));
else if (ans==ans2) printf("%d ",lca(x,z));
else if (ans==ans3) printf("%d ",lca(y,z));
printf("%d\n",ans);
}
}
bzoj 1832: [AHOI2008]聚会的更多相关文章
- BZOJ 1832: [AHOI2008]聚会( LCA )
LCA模板题...不难发现一定是在某2个人的LCA处集合是最优的, 然后就3个LCA取个最小值就OK了. 距离就用深度去减一减就可以了. 时间复杂度O(N+MlogN) (树链剖分) -------- ...
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1841 Solved: 857[Submit][ ...
- 【BZOJ】1832: [AHOI2008]聚会
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...
- bzoj 1787 && bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)算法竞赛进阶指南
题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通 ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- bzoj 1832 lca
1832: [AHOI2008]聚会 Time Limit: 10 Sec Memory Limit: 64 MB Description Y岛风景美丽宜人,气候温和,物产丰富.Y岛上有N个城市,有 ...
- BZOJ 1790: [Ahoi2008]Rectangle 矩形藏宝地
BZOJ 1790: [Ahoi2008]Rectangle 矩形藏宝地 题目传送门 [题目大意] 游戏的主办方把这块开阔地当作第一象限,将所有可能埋藏宝藏的地方划成一个个矩形的土地,并把这些矩形土地 ...
- bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...
- BZOJ 1832、1787 洛谷 4281 [AHOI2008]紧急集合
[题解] 题目要求找到一个集合点,使3个给定的点到这个集合点的距离和最小,输出集合点的编号以及距离. 设三个点为A,B,C:那么我们可以得到Dis=dep[A]+dep[B]+dep[C]-dep[L ...
随机推荐
- @Controller 和 @RestController 的区别
@Controller和@RestController的区别? 官方文档:@RestController is a stereotype annotation that combines @Respo ...
- Day8 - C - Largest Rectangle in a Histogram HDU - 1506
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...
- Day2-F-A Knight's Journey POJ-2488
Background The knight is getting bored of seeing the same black and white squares again and again an ...
- 073、Java面向对象之利用构造方法为属性赋值
01.代码如下: package TIANPAN; class Book { // 定义一个新的类 private String title; // 书的名字 private double price ...
- sqlite帮助类
帮助类 using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; usi ...
- Django 利用第三方平台实现用户注册02
前言: 上篇博客我们已经对设置了图形验证码,短信验证码对用户信息进行了一些简单的验证,本篇博客我们会将上篇的一些验证方法进行结合,来进一步完成我们的注册工作 1. 创建视图类 在user中的view创 ...
- 免费的 Linux 分区管理器使用介绍
下面的列表没有特定的排名顺序.大多数分区工具应该存在于 Linux 发行版的仓库中. GParted 这可能是 Linux 发行版中最流行的基于 GUI 的分区管理器.你可能已在某些发行版中预装它.如 ...
- 编程题目 定义栈的数据类型,请在类型中实现一个能够得到栈最小元素的minx函数。
首先自己用 节点 实现了 栈 这种数据类型 为了实现题目了要求,我使用的两个栈. 一个栈 用来 push pop 用户的数据, 另外一个栈用来存放 最小元素(涉及元素比较) 代码如下: #!/usr/ ...
- 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要
前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教 ...
- axis2--生成的wsdl文件方法的参数问题
我是一个使用axis2的新手,发现一个问题: * axis2生成的wsdl文件中关于提供服务的方法,其参数名称丢失,会变成args0 * , 原因: axis2 无法从java字节码中获取关于方法签名 ...