算法分析
DFS 统计每颗子树的前 20 大的值后合并时,合并所有子树中前 20 大的值,就这样递归处理即可。
AC code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int>g[N],num[N];
int x[N];
void dfs(int now,int fa)
{
num[now].push_back(x[now]);
for(auto ne : g[now])
{
if(ne != fa)
{
dfs(ne,now);
for(auto k : num[ne])
{
num[now].push_back(k);
}
}
}
sort(num[now].begin(),num[now].end());
reverse(num[now].begin(),num[now].end());
if(num[now].size() > 20) num[now].resize(20);
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i= 1;i <= n;i ++) scanf("%d",&x[i]);
for(int i = 1;i <= n - 1;i ++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1,0);
while(q --)
{
int v,k;
scanf("%d%d",&v,&k);
printf("%d\n",num[v][k - 1]);
}
return 0;
}