對於三個點x、y和
z,設a=lca(x,y)
,b=lca(x,z)
,不妨假設a的深度比
b大,則b是
a的祖先(因為a是
x的祖先,b也是
x的祖先)。
首先將集合點定在a,考慮
a向每乙個方向調整,
a向父親調整會讓x和
y答案加一,
a向靠近
x(y同理
)的兒子調整,會讓y和
z答案加一,向其他兒子調整,會讓三者答案都加一,由此發現
a是最合適的點(這個過程似乎並不是很嚴謹,可以理解就行)。
1 #include2view codeusing
namespace
std;
3#define n 500005
4struct
jiedge[n<<1];7
int e,n,m,x,y,z,head[n],in[n],out[n],s[n],f[n][21];8
bool pd(int x,int
y)11
int lca(int x,int
y)17
int len(int x,int
y)20
void add(int x,int
y)25
void dfs(int k,int fa,int
sh)34
intmain()
42 x=0
;43 dfs(1,1,0
);44
for(int i=1;i<=m;i++)
49 }
bzoj 1787 Meet 緊急集合
給出bzoj鏈結。這個題還是求最近公共祖先的問題。而該題不同於別的題,它是需要求三個點的最近公共祖先。我們就需要求出三個點兩兩之間的lca。而這三個lca之間,必有兩個是相同的。如果兩個點相同,那另一點就是那三個點的lca。如果三個點都相同,那麼該點就是那三個點的lca。最後還需要統計走過的邊的長度...
排序 緊急集合
時間限制 1 sec 記憶體限制 64 mb 提交 32 解決 13 提交 狀態 討論版 命題人 題目描述 史上著名的大魔導師列別捷夫曾經說過 平靜的湖面,鍛鍊不出精悍的水手 安逸的生活打造不出時代的偉人。這句話用在監獄的獄警身上實在是再恰當不過,由於監獄一千年來從未出過任何差錯,因此幾乎所有的獄警...
排序 緊急集合
題目描述 史上著名的大魔導師列別捷夫曾經說過 平靜的湖面,鍛鍊不出精悍的水手 安逸的生活打造不出時代的偉人。這句話用在監獄的獄警身上實在是再恰當不過,由於監獄一千年來從未出過任何差錯,因此幾乎所有的獄警都或多或少的有些懶散,我們可以將之量化為乙個數值即懶散值。所以當典獄長決定集合n個獄警以圍捕修羅王...