洛谷P4281 緊急集合 聚會 LCA

2022-09-03 05:00:10 字數 1134 閱讀 5668

給出一棵樹,每次給出三個點x,y

,zx,

y,z,求哪乙個點與這三個點的距離之和最近。

首先,很明顯的一件事情是:給出一棵樹上的三個點,這三個點中總有兩個的lca

lca是一樣的。

證明:

假設我們能找到乙個點,這個點的左子樹中有2個標記點,右子樹中有1個標記點(或者左子樹1個,右子樹2個),那麼很明顯左子樹中的兩個點分別與右子樹的點取lca

lca的結果是一樣的,都是選擇的點。

那麼如果我們找不到這樣的點,那麼就只有這三個點在一條鏈上可能。

那麼如果這三個點在一條鏈上,那麼很明顯在下面的兩個點與在上面的點取lca

lca的結果是一樣的。都是上面那個點。

證畢。

好吧這個證明並不嚴謹,但是再仔細想一想就會發現是對的。

所以,答案很明顯就出來了。三個lca

lca中不同的那個就是最佳位置。

#include

#include

#include

#define n 500100

#define lg 20

using

namespace std;

int n,m,tot,head[n]

,f[n]

[lg+1]

,dep[n]

,l1,l2,l3;

struct edge

e[n*2]

;int in;

char ch;

intread()

//快讀,不加好像會t

void

add(

int from,

int to)

void

dfs(

int x,

int fa)

}int

lca(

int x,

int y)

return f[x][0

];}int

main()

dep[0]

=-1;

dfs(1,

0);for

(int i=

1;i<=m;i++

)return0;

}

洛谷 4281 緊急集合

歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...

P4281 AHOI2008 緊急集合 聚會

題意描述 link 歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有 n 個等待點,有 n 1 條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 ...

P4281 AHOI2008 緊急集合 聚會

給定一棵樹,邊權為 1 多次詢問,給出三個點 a,b,c 求三個點的中點和到中點的總距離 定義中點為 x 滿足 dis a,x dis b,x dis c,x 最小 除錯日誌 jump 陣列開小,只開了 19 首先是樹上兩點距離 dis x,y dep x dep y 2 dep lca x,y 根...