题意

有一颗树,多次询问:给出三个节点,求节点\(k\)使距离之和最小,且求距离。

思路

\(lca\)裸题。

这里可以证明一个性质:两两\(lca\)会得出三个节点,其中至少有两个重合。

证明:

显然有三种分布情况:

  • 三个节点都在同一颗子树上,这时公共\(lca\)显然为子树根。

  • 两个节点在同一颗子树上。假设这两个点(\(a,b\))的\(lca\)为\(x\),而另一个节点为\(y\),那么\(lca(a,y)=lca(b,y)=lca(x,y)\)。显然有两个重合。

  • 三个节点都在不同子树上,同第一种情况。

\(Q.E.D\)

有了上面的性质,我们在计算的时候可以稍微减少计算量,

\(ans=dep[a]+dep[b]+dep[c]-dep[lca(a,b)]+dep[lca(b,c)]+dep[lca(c,a)]\)

但是这样还是过不了,因为\(OJ\)卡倍增\(lca\),所以必须使用树剖求\(lca\)。


代码

(倍增90分)

#include <bits/stdc++.h>using namespace std;namespace StandardIO {template<typename T> inline void read (T &x) {x=0;T f=1;char c=getchar();for (; c<'0'||c>'9'; c=getchar()) if (c=='-') f=-1;for (; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';x*=f;}template<typename T> inline void write (T x) {if (x<0) putchar('-'),x=-x;if (x>=10) write(x/10);putchar((x%10)+'0');}}using namespace StandardIO;namespace Solve {const int N=500500;int n,m;int cnt;int head[N];struct node {int to,next;} edge[N<<1];int fa[N][31],dep[N];inline void add (int a,int b) {edge[++cnt].to=b,edge[cnt].next=head[a],head[a]=cnt;}void dfs (int now,int f) {fa[now][0]=f,dep[now]=dep[f]+1;for (register int i=1; (1<<i)<=dep[now]; ++i) {fa[now][i]=fa[fa[now][i-1]][i-1];}for (register int i=head[now]; i; i=edge[i].next) {int to=edge[i].to;if (dep[to]) continue;dfs(to,now);}}inline int lca (int x,int y) {if (dep[x]>dep[y]) swap(x,y);for (register int i=20; i>=0; --i) {if (dep[y]>=dep[x]+(1<<i)) y=fa[y][i];}if (x==y) return x;for (register int i=20; i>=0; --i) {if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];}return fa[x][0];}inline void Main () {read(n),read(m);for (register int i=1; i<=n-1; ++i) {int a,b;read(a),read(b);add(a,b),add(b,a);}dfs(1,0);for (register int i=1; i<=m; ++i) {int a,b,c,ab,bc,ca,ans,dis;read(a),read(b),read(c);ab=lca(a,b),bc=lca(b,c),ca=lca(c,a);if (ab==bc) ans=ca;else if (ab==ca) ans=bc;else if (bc==ca) ans=ab;dis=dep[a]+dep[b]+dep[c]-dep[ab]-dep[bc]-dep[ca];write(ans),putchar(' '),write(dis),putchar('\n');}}}int main () {Solve::Main();
}

转载于:https://www.cnblogs.com/ilverene/p/11206214.html

聚会「AHOI 2008」相关推荐

  1. 「AHOI / HNOI2018」转盘 解题报告

    「AHOI / HNOI2018」转盘 可能是我语文水平不太行... 首先可以猜到一些事实,这个策略一定可以被一个式子表示出来,不然带修修改个锤子. 然后我们发现,可以枚举起点,然后直接往前走,如果要 ...

  2. 「AHOI / HNOI2017」影魔

    「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ...

  3. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列 题目描述 给定 nnn 个整数 a1,a2,-,an(0≤ai≤n),以及 nnn 个整数 w1,w2,-,wn.称 a1,a2,-,an 的一个 ...

  4. 「SDOI 2008」山贼集团

    传送门 problem 给定一棵 nnn 个点且根为 111 的树,有 ppp 个部门,每个部门会占据一个点,占据点会有代价,不同部门可以占据同一个点,每个部门的管辖范围是 111 到他占据点的链上的 ...

  5. loj 2495. 「AHOI / HNOI2018」转盘

    题意: 在一个环形转盘上,第iii个物品将在Ti" role="presentation" style="position: relative;"&g ...

  6. 【扩展lucas】LOJ#2023. 「AHOI / HNOI2017」抛硬币

    Description 抛硬币,小A投 a a a次,小B投 b b b次,求小A正面次数多于小B正面次数的方案数. 1 ≤ a , b ≤ 1 e 15 , 0 ≤ a − b ≤ 1 e 4 , ...

  7. KTV「消亡史」:辉煌、挫折与新生

    [潮汐商业评论/原创] 这是Ina工作的第五年,疫情之后,第一场大学同学聚会就定在了周末. 同学群里大家热烈地讨论着聚会的地点,"要不咱们去KTV吧,哈哈哈哈哈哈",突然有人提议到 ...

  8. 清华姚班校友陈丹琦斩获2022斯隆奖!「诺奖风向标」27位华人学者入选

      视学算法报道   编辑:桃子 拉燕 [新智元导读]刚刚,有「诺奖风向标」之称的斯隆研究奖公布了最新获奖名单.今年,共有118名学者当选.值得一提的是,清华姚班毕业的华人科学家陈丹琦位列其中. 刚刚 ...

  9. 「硅仙人」吉姆 · 凯勒:我在特斯拉是最闲的员工,却要在英特尔管一万人

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 芯片业界传奇人物的「凡尔赛」方式也是与众不同的. 从英特尔离职半年后, ...

  10. 组建元宇宙军团!「谷歌实验室」重生,超700人神秘团队都有谁?

    来源:新智元 当微软和Meta高调推出自己的「元宇宙」时. 谁还记得,是谷歌做出的第一个AR眼镜? ‍‍ 上船元宇宙,谷歌再发力 随着2021年11月「谷歌实验室」的神秘复出,谷歌也是大动作频频! 2 ...

最新文章

  1. YOLOv4实用训练实践
  2. 一个用于 Entity Framework 对象拷贝的方法
  3. IE浏览器导出问题。。好要命
  4. Zookeeper+kafka集群搭建,问题(zoo.cfg file is running,it‘s probably not running,option ‘UseCompressedOops‘)
  5. 18.fields_capabilities_api
  6. sublime重装后碰到Unable to read Packages
  7. merge into on多个条件_“京沪二线”贯穿山东半岛,沿线多个城市将受益,来了解一下吧...
  8. 常见的网络工程师面试问题
  9. java填充线缺口,在geom_freqpoly线下填充区域的最简单方法是什么?
  10. LeetCode 303,560,1248 (前缀求和 )
  11. 确保移动设备的安全:在保护数据的同时提高工作效率
  12. 10月21日Ajax培训日记
  13. python实现雪花飘落效果_python实现雪花飘落效果实例讲解
  14. OSChina 周一乱弹 ——这个公主都没一旁的汪可爱
  15. VueJS学习资料大全
  16. 随机变量乘积的期望和方差
  17. TMC2208-LA步进电机驱动芯片
  18. 关于网页制作的一些动态效果
  19. 勇斗勒索软件的英雄疑因旧罪被捕;华为、腾讯为用户数据起冲突
  20. EAS F7控件弹出表格隐藏某列

热门文章

  1. 图说单播,组播,广播,选播和地域播
  2. HTML和CSS代码片段快速编写方式(Emmet Documentation)
  3. maven项目转换成dynamic项目
  4. 架构师如何才能够设计一个安全的架构
  5. Java多线程:线程死锁
  6. C言语教程第五章:函数(4)
  7. re.split() 根据句子中的序号进行切分
  8. 【基础】吴恩达机器学习笔记 - 线性回归 代价函数 梯度下降
  9. 爬虫_抓取51job招聘数据
  10. 基于DEAP库的python进化算法-5.遗传算法求解TSP问题的改进