題解:
題目中保證了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...