題意
給一棵 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 ...