cumtoj修建道路 LCA倍增

2021-09-26 05:59:45 字數 1439 閱讀 5219

題目描述

n

nn個點n−1

n-1n−

1條邊,點之間兩兩連通,每次詢問3

33個點,求使這3

33個點連通的最小花費。(1≤n

,q≤1

05

1\leq n,q\leq 10^5

1≤n,q≤

105)

因為給的是一顆樹,最終的答案就是dis

t(x,

y)+d

ist(

y,z)

+dis

t(x,

z)2.

\frac.

2dist(

x,y)

+dis

t(y,

z)+d

ist(

x,z)

​.倍增求lca即可。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mem(a, x) memset(a,x,sizeof(a))

#define iosup ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using

namespace std;

const

int n =

1e5+10;

int fa[n][1

<<5]

;int n, q, dep[n]

;ll dis[n]

;struct edge

;vector g[n]

;void

dfs(

int u,

int father)

}inline

void

init()

);g[v]

.push_back

(edge);

} dis[1]

= dep[1]

=0;dfs(1

,0);

}int

lca(

int u,

int v)

if(u==v)

return u;

for(

int i=

20;i>=

0;i--)}

return fa[u][0

];}ll d

(int u,

int v)

intmain()

return0;

}

倍增LCA複習

時間過去了如此之久,我連倍增lca都不怎麼記得了,要粗事啊。首先預處理層數和每個節點的父親,然後預處理p陣列,p i,j 表示i向上第2 j個祖先。最後對於每個詢問x,y先把x,y變成同一層數的 x或y向上走直到兩個層數相等 然後x,y同時向上走,直到x和y的父親相同位置。自 1.dfs預處理出所有...

倍增LCA模板

注意!本篇題解不適合初學lca的同學學習,因為我講的很爛很不清楚。倍增,顧名思義,就是成倍增加的意思。我們知道,任何乙個數字都可以表示成二進位制。那麼對於一條長度為n的鏈,我們總是可以跳大概logn次到達最後。對於鏈上任意一點,我們都可以在大概logn的複雜度下詢問到,其實倍增的思路就是二分,和快速...

LCA倍增講解

這道題值得一刷 題解裡的巨佬都用tarjan 窩太難了 實際上是他們太巨了 本人 馬蜂 碼風獨特,請見諒 include include include include using namespace std inline intread while ch 0 ch 9 return x f inl...