#include<bits/stdc++.h> using namespace std; const int N = 25 * 1000 + 7; const long long mod = 1e9+7; long long start; int n, k, p, a, b, p_max; int parents[N][20]; int dep[N]; int preprocess[N]; long long val[N]; long long powers[100]; bool odw[N]; vector<pair<int, int> >G[N]; vector<long long>v; void dfs(int x, int o) { parents[x][0] = o; for(int i = 1; i < 20; i++) parents[x][i] = parents[parents[x][i-1]][i-1]; dep[x] = dep[o] + 1; for(int i = 0; i < (int)(G[x].size()); i++) if(G[x][i].first != o) { val[G[x][i].first] = val[x] + powers[G[x][i].second]; dfs(G[x][i].first, x); } } int lca(int a, int b) { if(dep[a] > dep[b]) swap(a,b); for(int i = 19; i >= 0; i--) if(dep[parents[b][i]] >= dep[a]) b = parents[b][i]; if(a == b) return a; for(int i = 19; i >= 0; i--) if(parents[a][i] != parents[b][i]) { a = parents[a][i]; b = parents[b][i]; } return parents[a][0]; } bool test(long long x) { int sure = 0, less = 0; for(int i = 0; i < (int)(v.size()); i++) { if(v[i] < x || v[i] == x && !sure) less++; if(v[i] == x) sure++; if(less > k) return false; } //cout << "less: " << less << " sure: " << sure << " x: " << x << "\n\n"; if((less == k && sure) || less < k) return true; return false; } void do_it() { for(int i = 1; i < n; i++) for(int j = i + 1; j <= n; j++) { int LCA = lca(i,j); long long va = 0; if(LCA != 1) va = val[i] - val[LCA] + val[j] - val[LCA]; else va = val[i] + val[j]; v.push_back(va); } } long long bs() { do_it(); long long L = 0, P = 3125e10, S = 0; while(L < P) { //cout << S << "\n"; S = (L + P + 1) / 2; if(test(S)) L = S; else P = S - 1; } return L; } int main() { ios_base::sync_with_stdio(0); cin >> n >> k; long long w = n; for(int i = 1; i < 100; i++) { powers[i] = w; w *= (long long)(n); } //for(int i = 1; i <= 10; i++) cout << powers[i] << " "; //cout << "\n"; for(int i = 1; i < n; i++) { cin >> a >> b >> p; //p_max = max(p_max, p); G[a].push_back(make_pair(b,p)); G[b].push_back(make_pair(a,p)); } for(int i = 0; i < 20; i++) parents[1][i] = 1; dfs(1,1); //for(int i = 1; i <= 50; i++) cout << parents[i][0] << " "; //cout << "\n"; cout << bs() % mod; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include<bits/stdc++.h> using namespace std; const int N = 25 * 1000 + 7; const long long mod = 1e9+7; long long start; int n, k, p, a, b, p_max; int parents[N][20]; int dep[N]; int preprocess[N]; long long val[N]; long long powers[100]; bool odw[N]; vector<pair<int, int> >G[N]; vector<long long>v; void dfs(int x, int o) { parents[x][0] = o; for(int i = 1; i < 20; i++) parents[x][i] = parents[parents[x][i-1]][i-1]; dep[x] = dep[o] + 1; for(int i = 0; i < (int)(G[x].size()); i++) if(G[x][i].first != o) { val[G[x][i].first] = val[x] + powers[G[x][i].second]; dfs(G[x][i].first, x); } } int lca(int a, int b) { if(dep[a] > dep[b]) swap(a,b); for(int i = 19; i >= 0; i--) if(dep[parents[b][i]] >= dep[a]) b = parents[b][i]; if(a == b) return a; for(int i = 19; i >= 0; i--) if(parents[a][i] != parents[b][i]) { a = parents[a][i]; b = parents[b][i]; } return parents[a][0]; } bool test(long long x) { int sure = 0, less = 0; for(int i = 0; i < (int)(v.size()); i++) { if(v[i] < x || v[i] == x && !sure) less++; if(v[i] == x) sure++; if(less > k) return false; } //cout << "less: " << less << " sure: " << sure << " x: " << x << "\n\n"; if((less == k && sure) || less < k) return true; return false; } void do_it() { for(int i = 1; i < n; i++) for(int j = i + 1; j <= n; j++) { int LCA = lca(i,j); long long va = 0; if(LCA != 1) va = val[i] - val[LCA] + val[j] - val[LCA]; else va = val[i] + val[j]; v.push_back(va); } } long long bs() { do_it(); long long L = 0, P = 3125e10, S = 0; while(L < P) { //cout << S << "\n"; S = (L + P + 1) / 2; if(test(S)) L = S; else P = S - 1; } return L; } int main() { ios_base::sync_with_stdio(0); cin >> n >> k; long long w = n; for(int i = 1; i < 100; i++) { powers[i] = w; w *= (long long)(n); } //for(int i = 1; i <= 10; i++) cout << powers[i] << " "; //cout << "\n"; for(int i = 1; i < n; i++) { cin >> a >> b >> p; //p_max = max(p_max, p); G[a].push_back(make_pair(b,p)); G[b].push_back(make_pair(a,p)); } for(int i = 0; i < 20; i++) parents[1][i] = 1; dfs(1,1); //for(int i = 1; i <= 50; i++) cout << parents[i][0] << " "; //cout << "\n"; cout << bs() % mod; return 0; } |