# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
126328 | songc | Race (IOI11_race) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, int> pii;
int N, K, ans;
vector<pii> L[202020];
LL S[202020];
int C[202020];
set<pii>* f(int u, int p){
set<pii> *M = new set<pii>, *T;
for (pii it : L[u]){
if (it.second == p) continue;
T = f(it.second, u);
T->insert(pii(-S[it.second], -C[it.second]));
S[it.second] += it.first;
C[it.second]++;
auto P = T->lower_bound(pii(K-S[it.second], -N));
if (P->first == K-S[it.second] && P != T->end()) ans = min(ans, P->second+C[it.second]);
if (M->size() < T->size()) {
swap(M, T);
swap(S[u], S[it.second]);
swap(C[u], C[it.second]);
}
for (pii v : *T) {
P = M->lower_bound(pii(K-v.first-S[it.second]-S[u], -N));
if (P->first == K-v.first-S[it.second]-S[u] && P != M->end()) ans = min(ans, P->second+v.second+C[u]+C[it.second]);
}
for (pii v : *T) M->insert(pii(v.first+S[it.second]-S[u], v.second+C[it.second]-C[u]));
T->clear();
}
return M;
}
int main(){
int u, v, w;
scanf("%d %d", &N, &K);
for (int i=1; i<N; i++){
scanf("%d %d %d", &u, &v, &w);
L[u].push_back(pii(w, v));
L[v].push_back(pii(w, u));
}
ans = N;
f(0, -1);
if (ans >= N) ans = -1;
printf("%d\n", ans);
return 0;
}