P4281 [AHOI2008]紧急集合 / 聚会

时间:2023-02-21 11:17:14

P4281 [AHOI2008]紧急集合 / 聚会

lca

题意:求3个点的lca,以及3个点与lca的距离之和。


性质:设点q1,q2,q3

两点之间的lca

t1=lca(q1,q2)

t2=lca(q1,q3)

t3=lca(q2,q3)

一定有两个lca重合


3个点的公共lca一定在 两个lca之间(有重合)

而重合的lca深度必定更浅

所以3个点的公共lca就是那个不重合的lca

(完整证明还是看题解吧TAT)

使用倍增法(懒得打树剖了qwq)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
template <typename T> inline void output(T x){
if(!x) {putchar(); return ;}
int wt[],l=;
while(x) wt[++l]=x%,x/=;
while(l) putchar(wt[l--]+);
}
int n,m,ans,fa[][],d[];
int cnt,hd[],nxt[],ed[],poi[]; //注意边开2倍
inline void add(int x,int y){
nxt[ed[x]]=++cnt; hd[x]= hd[x] ? hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y;
}
inline void dfs(int x,int _fa){
d[x]=d[_fa]+; fa[][x]=_fa;
for(int i=;(<<i)<=d[x];++i) fa[i][x]=fa[i-][fa[i-][x]];
for(int i=hd[x];i;i=nxt[i]) if(poi[i]!=_fa) dfs(poi[i],x);
}
inline int lca(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=;i>=;--i) if(d[fa[i][x]]>=d[y]) x=fa[i][x];
if(x==y) return x;
for(int i=;i>=;--i) if(fa[i][x]!=fa[i][y]) x=fa[i][x],y=fa[i][y];
return fa[][x];
}
//----------lca模板---------
int main(){
read(n); read(m); int q1,q2,q3;
for(int i=;i<n;++i) read(q1),read(q2),add(q1,q2),add(q2,q1);
dfs(,);
for(int i=;i<=m;++i){
read(q1),read(q2),read(q3); ans=;
int t1=lca(q1,q2);
int t2=lca(q1,q3);
int t3=lca(q2,q3);
if(t1==t2) ans=t3;
else if(t1==t3) ans=t2;
else if(t2==t3) ans=t1; //找到不同的那个lca
output(ans),putchar(' ');
output(d[q1]+d[q2]+d[q3]-d[t1]-d[t2]-d[t3]),putchar('\n');
}return ;
}

P4281 [AHOI2008]紧急集合 / 聚会的更多相关文章

  1. P4281 &lbrack;AHOI2008&rsqb;紧急集合 &sol; 聚会&lbrack;LCA&rsqb;

    解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...

  2. LUOGU P4281 &lbrack;AHOI2008&rsqb;紧急集合 &sol; 聚会 &lpar;lca&rpar;

    传送门 解题思路 可以通过手玩或打表发现,其实要选的点一定是他们三个两两配对后其中一对的$lca$上,那么就直接算出来所有的$lca$,比较大小就行了. #include<iostream&gt ...

  3. &lbrack;AHOI2008&rsqb;紧急集合 &sol; 聚会(LCA)

    [AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通 ...

  4. LCA【p4281】&lbrack;AHOI2008&rsqb;紧急集合 &sol; 聚会

    Description 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等 ...

  5. &lbrack;AHOI2008&rsqb;紧急集合 &sol; 聚会

    题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...

  6. 【题解】洛谷P4281 &lbrack;AHOI2008&rsqb; 紧急集合(求三个点LCA)

    洛谷P4281:https://www.luogu.org/problemnew/show/P4281 思路 答案所在的点必定是三个人所在点之间路径上的一点 本蒟蒻一开始的想法是:先求出2个点之间的L ...

  7. Luogu 4281 &lbrack;AHOI2008&rsqb;紧急集合 &sol; 聚会

    BZOJ 1832 写起来很放松的题. 首先发现三个点在树上一共只有$3$种形态,大概长这样: 这种情况下显然走到三个点的$lca$最优. 这种情况下走到中间那个点最优. 这种情况下走到$2$最优. ...

  8. 洛谷 P4281 &lbrack;AHOI2008&rsqb; 紧急集合 题解

    挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解.值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为 ...

  9. 「AHOI2008」「LuoguP4281」紧急集合 &sol; 聚会(LCA

    题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...

随机推荐

  1. android 布局优化常用技巧

    android对多个模块都要是要的UI逻辑的致辞除了fragment之外,没有别的东西可以支持了, include,merge,viewstub只能支持公用的ui,但是这个通用支持不能包含逻辑(jav ...

  2. ELK——在 CentOS&sol;Linux 把 Kibana 3&period;0 部署在 Nginx 1&period;9&period;12

    上一篇文章<安装 logstash 2.2.0.elasticsearch 2.2.0 和 Kibana 3.0>,介绍了如何安装 Logstash.Elasticsearch 以及用 P ...

  3. POJ 3461 裸的KMP

    直接贴代码吧 #include<cstdio> #include<cstring> ],T[]; ]; int n,m; void getfail() { f[] = ; f[ ...

  4. 修改 AndroidManifest minSdkVersion 的方法

    1.修改AndroidManifest文件    使用16进制编辑器检索位置:FF FF FF FF 08 00 00 10 ??    将??替换为原APK的minSdkVersion对应的16进制 ...

  5. 10 个你需要了解的最佳 javascript 开发实践

    原文:Top 10 “Must Follow” JavaScript Best Practices Javascript 的很多扩展的特性是的它变得更加的犀利, 同时也给予程序员机会创建更漂亮并且更让 ...

  6. Nginx工作原理和优化、漏洞(转)

    查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -Vnginx version: nginx/1.2.3built by gc ...

  7. DataReader的例子

    前: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataReader对 ...

  8. 366&period; Find Leaves of Binary Tree C&num;

    Example:Given binary tree 1 / \ 2 3 / \ 4 5 Returns [4, 5, 3], [2], [1]. Explanation: 1. Removing th ...

  9. 【转载】XSS学习笔记

    XSS的分类 非持久型 非持久型XSS也称反射型XSS.具体原理就是当用户提交一段代码的时候,服务端会马上返回页面的执行结果.那么当攻击者让被攻击者提交一个伪装好的带有恶意代码的链接时,服务端也会立刻 ...

  10. makefile编写--引用

    1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之 ...