樹上倍增 城市網路

2021-10-05 13:39:01 字數 829 閱讀 5735

題解:

題目中保證了u到v一定在最短路徑上,所以考慮用樹上倍增的方法。我們fa陣列存的是比當前節點val值嚴格大的最近祖先。然後每次倍增的時候更新答案就可以了。

#include

using

namespace std;

typedef

long

long ll;

const

int n=

2e5+7;

int head[n]

,e[n<<1]

,ne[n<<1]

,fa[n][25

],val[n]

,cnt,pre[n]

,dep[n]

;void

add(

int a,

int b)

void

dfs(

int u,

int f)

else

} fa[u][0

]=fa[x][0

];}for

(int i=

1;i<=

20;i++

)for

(int i=head[u]

;~i;i=ne[i])}

intmain()

for(

int i=

1;i<=q;i++

)dfs(1

,0);

for(

int i=

1;i<=q;i++)}

printf

("%lld\n"

,res);}

}

城市網路 樹上倍增

題目鏈結 題意 有乙個樹狀的城市網路 即 n 個城市由 n 1 條道路連線的連通圖 首都為 1 號城市,每個城市售賣價值為 a i 的珠寶。現在安排有 q 次行程,每次行程為從 u 號城市前往 v 號城市 走最短路徑 保證 v 在 u 前往首都的最短路徑上。在每次行程開始時,你手上有價值為 c 的珠...

牛客 城市網路 樹上倍增

題意 給一棵 n nn 個點的樹,每個節點代表乙個城市,每個城市賣價值為 a ia i ai 的珠寶,有 q qq 次詢問,每次詢問從 u uu 城市到 v vv 城市,一開始有價值為 c cc 的珠寶,如果當前經過的城市珠寶價值大於已有的所有珠寶的最大價值,就購買。保證 v vv 在 u uu 到...

LOJ 6192 城市網路(樹上倍增)

一棵以 1 號節點為根的樹,每個點有乙個權值,有 q 個詢問,每次從 x 點開始往某個祖先 y 走,初始有權值 c 如果路徑上遇到更大的權值,那麼 c 改為那個權值,問會修改多少次。資料範圍 n leq 2 times 10 5 首先因為本題沒有修改操作,所以可以離線維護。然後我們發現如果我們在 x...