牛客 城市網路 樹上倍增

2021-10-16 08:12:37 字數 1490 閱讀 6829

題意

給一棵 n

nn 個點的樹,每個節點代表乙個城市,每個城市賣價值為 a

ia_i

ai​ 的珠寶,有 q

qq 次詢問,每次詢問從 u

uu 城市到 v

vv 城市,一開始有價值為 c

cc 的珠寶,如果當前經過的城市珠寶價值大於已有的所有珠寶的最大價值,就購買。保證 v

vv 在 u

uu 到根的路徑上。問這次行程有幾次購買。

題解**

#pragma region

//#pragma optimize("ofast")

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

#define tr t[root]

#define lson t[root << 1]

#define rson t[root << 1 | 1]

#define rep(i, a, n) for (int i = a; i <= n; ++i)

#define per(i, a, n) for (int i = n; i >= a; --i)

#pragma endregion

const

int maxn =

2e5+5;

int n, q;

vector<

int> g[maxn]

;int a[maxn]

, to[maxn]

;int fa[maxn][20

], dep[maxn]

;void

dfs(

int u,

int f)

fa[u][0

]=(a[x]

> a[u]

? x : fa[x][0

]);for

(int i =1;

(1<< i)

<= dep[u]

;++i)

fa[u]

[i]= fa[fa[u]

[i -1]

][i -1]

;for

(auto v : g[u])}

intquery

(int id)

}return ans;

}int

main()

rep(i, n +

1, n + q)

dfs(1,

0);rep

(i,1

, q)

printf

("%d\n"

,query

(i))

;}

牛客NC13331 城市網路 樹上倍增

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

城市網路 樹上倍增

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

樹上倍增 城市網路

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