题意
建立一棵树,每次查询在该节点以及最长深度为t的子树之间的点权最大值,也就是在要查询的节点的分支上,求向下深度0~t的点权的最大值。
代码实现
想着新生赛应该没那么难,于是用简单递归,没想到过了。^_^。我们只需要先存下来节点,然后给出查询,我们递归时间和节点,每次递归取最大值,最后返回的就是答案。
代码
#include <bits/stdc++.h>
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(0), cout.tie(0);
#define debug(a) cout << "=======" << a << "========" << endl;
#define endl '\n'
#define c(a, b) cout << a << ' ' << b << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 5e5 + 10, mod = 1e9 + 7, T = 9901;
const double ex = 1e-7;
typedef pair<int, int> PII;
int dix[N];
int h[N], ne[N], e[N], w[N], idx;
int f[N];
int n, m, k;
void add(int x, int y)
{
e[idx] = y;
ne[idx] = h[x];
h[x] = idx++;
}
int find(int t, int x)
{
int ans = f[x];
if (!t)//t为0的话直接返回
return ans;
for (int i = h[x]; i != -1; i = ne[i])
{
int j = e[i];
ans = max(ans, find(t - 1, j));//依次递归取最大值
}
return ans;
}
int main()
{
IOS
memset(h, -1, sizeof h);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> f[i];
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
add(x, y);
}
cin >> m;
while (m--)
{
int t, x;
cin >> t >> x;
cout << find(t, x) << endl;
}
return 0;
}