Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #define task "dfs"
- using namespace std;
- using ll = long long;
- using ld = long double;
- const int Inf = 1e9 + 7;
- const int N = 4e5 + 5;
- int n, k, l, cntno[N];
- int v[N], cnt[N], dp[N][4], cnt1[N];
- bool vis[N], ck[N];
- vector<int> adj[N];
- void Read()
- {
- cin >> n >> k;
- for (int i = 1; i <= n; ++i)
- cin >> v[i];
- for (int i = 1; i < n; ++i)
- {
- int u, v;
- cin >> u >> v;
- adj[u].emplace_back(v);
- adj[v].emplace_back(u);
- }
- }
- void dfscnt(int v)
- {
- vis[v] = 1;
- cnt[v] = 1;
- bool flag(0);
- for (auto i : adj[v])
- if (!vis[i])
- {
- if (ck[i])
- {
- dfscnt(i);
- if (cnt[i] == 0)
- flag = 1;
- else
- cnt[v] += cnt[i];
- cntno[v] += cntno[i];
- vis[i] = 0;
- }
- else
- {
- flag = 1;
- ++cntno[v];
- }
- }
- cnt1[v] = cnt[v];
- if (flag)
- cnt[v] = 0;
- }
- void dfs(int v, const int &root)
- {
- vis[v] = 1;
- cnt[v] = 1;
- bool flag(0);
- int max1(0), max2(0);
- for (auto i : adj[v])
- if (!vis[i])
- {
- if (ck[i])
- {
- dfs(i, root);
- if (cnt[i] == 0)
- {
- flag = 1;
- dp[v][1] = max(dp[v][1], dp[i][1] + (cntno[i] == cntno[root]) * cnt1[v]);
- if (max1 < dp[i][0])
- {
- max2 = max1;
- max1 = dp[i][0];
- }
- else if (max2 < dp[i][0])
- max2 = dp[i][0];
- }
- else
- cnt[v] += cnt[i];
- dp[v][3] = max(dp[v][3], dp[i][3]);
- }
- else
- {
- flag = 1;
- }
- }
- dp[v][3] = max(dp[v][3], cnt[v]);
- if (flag)
- {
- dp[v][0] = max1 + cnt[v];
- dp[v][1] = max(dp[v][1], max1 + max2 + cnt[v]);
- cnt[v] = 0;
- }
- }
- bool Check(int val)
- {
- for (int i = 1; i <= n; ++i)
- {
- vis[i] = 0;
- ck[i] = v[i] >= val;
- cnt[i] = cnt1[i] = cntno[i] = dp[i][0] = dp[i][1] = dp[i][3] = 0;
- }
- vector<int> s;
- s.reserve(n);
- for (int i = 1; i <= n; ++i)
- if (!ck[i])
- for (auto j : adj[i])
- if (ck[j])
- s.emplace_back(j);
- if (s.empty())
- for (int i = 1; i <= n; ++i)
- if (ck[i])
- {
- s.emplace_back(i);
- break;
- }
- for (auto i : s)
- if (!vis[i])
- {
- dfscnt(i);
- dfs(i, i);
- //cout << i << " " << dp[i][1] << " " << dp[i][0] << " " << dp[i][3] << "\n";
- if (dp[i][1] >= k || dp[i][0] >= k || dp[i][3] >= k)
- return true;
- }
- return false;
- }
- void Solve()
- {
- int l = 1, m, h = 1e6;
- while (l <= h)
- {
- m = (l + h) / 2;
- if (Check(m))
- l = m + 1;
- else
- h = m - 1;
- }
- cout << h;
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- Solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement