英语机构网站建设方案,五星级酒店网站建设方案,单位做网站注意什么,电子商务包括哪些专业[ABC239E] Subtree K-th Max
题面翻译
给定一棵 n n n 个节点的树#xff0c;每个节点的权值为 x i x_i xi。
现有 Q Q Q 个询问#xff0c;每个询问给定 v , k v,k v,k#xff0c;求节点 v v v 的子树第 k k k 大的数。 0 ≤ x i ≤ 1 0 9 , 2 ≤ n ≤ 1 0 5 , …[ABC239E] Subtree K-th Max
题面翻译
给定一棵 n n n 个节点的树每个节点的权值为 x i x_i xi。
现有 Q Q Q 个询问每个询问给定 v , k v,k v,k求节点 v v v 的子树第 k k k 大的数。 0 ≤ x i ≤ 1 0 9 , 2 ≤ n ≤ 1 0 5 , 1 ≤ Q ≤ 1 0 5 , 1 ≤ k ≤ 20 0\le x_i\le10^9,2\le n\le10^5,1\le Q\le10^5,1\le k\le20 0≤xi≤109,2≤n≤105,1≤Q≤105,1≤k≤20。
翻译提供xiaohaoaibiancheng66
题目描述
$ N $ 頂点の根付き木があります。頂点には $ 1 $ から $ N $ の番号がついており、根は頂点 $ 1 $ です。 $ i $ 番目の辺は頂点 $ A_i $ と $ B_i $ を結んでいます。 頂点 $ i $ には整数 $ X_i $ が書かれています。
$ Q $ 個のクエリが与えられます。$ i $ 番目のクエリでは整数の組 $ (V_i,K_i) $ が与えられるので、次の問題に答えてください。
問題頂点 $ V_i $ の部分木に含まれる頂点に書かれた整数のうち、大きい方から $ K_i $ 番目の値を求めよ
输入格式
入力は以下の形式で標準入力から与えられる。 $ N $ $ Q $ $ X_1 $ $ \ldots $ $ X_N $ $ A_1 $ $ B_1 $ $ \vdots $ $ A_{N-1} $ $ B_{N-1} $ $ V_1 $ $ K_1 $ $ \vdots $ $ V_Q $ $ K_Q $ 输出格式
$ Q $ 行出力せよ。$ i $ 行目には $ i $ 番目のクエリに対する答えを出力せよ。
样例 #1
样例输入 #1
5 2
1 2 3 4 5
1 4
2 1
2 5
3 2
1 2
2 1样例输出 #1
4
5样例 #2
样例输入 #2
6 2
10 10 10 9 8 8
1 4
2 1
2 5
3 2
6 4
1 4
2 2样例输出 #2
9
10样例 #3
样例输入 #3
4 4
1 10 100 1000
1 2
2 3
3 4
1 4
2 3
3 2
4 1样例输出 #3
1
10
100
1000提示
制約
$ 2\ \leq\ N\ \leq\ 10^5 $$ 0\leq\ X_i\leq\ 10^9 $$ 1\leq\ A_i,B_i\leq\ N $$ 1\leq\ Q\ \leq\ 10^5 $$ 1\leq\ V_i\leq\ N $$ 1\leq\ K_i\leq\ 20 $与えられるグラフは木である頂点 $ V_i $ の部分木は頂点を $ K_i $ 個以上持つ入力に含まれる値は全て整数である
Sample Explanation 1
この入力において与えられる木は下図のようなものです。  $ 1 $ 番目のクエリでは、頂点 $ 1 $ の部分木に含まれる頂点 $ 1,2,3,4,5 $ に書かれた数のうち大きい方から $ 2 $ 番目である $ 4 $ を出力します。 $ 2 $ 番目のクエリでは、頂点 $ 2 $ の部分木に含まれる頂点 $ 2,3,5 $ に書かれた数のうち大きい方から $ 1 $ 番目である $ 5 $ を出力します。
思路刚看到这种题就感觉写起来很别扭怎么还是要敢写才行错了不要紧根据k的范围我们可以知道我们只需要暴力遍历即可得出来每一个节点前20大的数
#includebits/stdc.husing namespace std;typedef long long ll;
typedef pairll, llPII;
const int N 2e5 10;
const int MOD 998244353;
const int INF 0X3F3F3F3F;
const int dx[] {-1, 1, 0, 0, -1, -1, 1, 1};
const int dy[] {0, 0, -1, 1, -1, 1, -1, 1};
const int M 1e6 10;vectorllans[N], a(N 1), ed[N];//存树void dfs(int u, int fa)
{vectorllo;o.push_back(a[u]);//存上自己for(auto it : ed[u]){if(it fa) continue;dfs(it, u);//一直遍历it那一个节点for(auto k : ans[it])//相当于那个节点上的数都给遍历完了{o.push_back(k);}}sort(o.begin(), o.end(), greaterll());//排好序//我们只需要取出前20即可int si min(20, (int)o.size());for(int i 0; i si; i ){ans[u].push_back(o[i]);}
}
int main()
{int n, q;cin n q;for(int i 1; i n; i ){cin a[i];}for(int i 1; i n - 1; i ){int u, v;cin u v;ed[u].push_back(v);ed[v].push_back(u);//存图}dfs(1, -1);//预处理出来第k大while(q --){int u, k;cin u k;cout ans[u][k - 1] endl;//因为下标从0开始的}
}