Submission #1228560

#TimeUsernameProblemLanguageResultExecution timeMemory
1228560tkm_algorithmsRace (IOI11_race)C++20
9 / 100
162 ms46244 KiB
/** * In the name of Allah * We are nothing and you're everything * Ya Muhammad! **/ #include <bits/stdc++.h> #include "race.h" //#include "grader.cpp"sdafasdfasdfsd using namespace std; using ll = long long; #define all(x) begin(x), end(x) //#define int ll const int NN = 2e5+5; vector<pair<ll, ll>> g[NN]; ll sz[NN], dep[NN]; ll sum[NN]; vector<ll> *vec[NN]; map<ll, ll> *mp[NN]; ll res = NN; void calc(int a = 0, int p = 0) { sz[a] = 1; for (auto i: g[a]) { if (i.first == p)continue; dep[i.first] = dep[a]+1; sum[i.first] = sum[a]+i.second; calc(i.first, a); sz[a] += sz[i.first]; } } int kk; void dfs(int a = 0, int p = 0, bool ok = true) { int mx = 0, big = -1; for (auto i: g[a]) { if (i.first != p && sz[i.first] > mx)mx = sz[i.first], big = i.first; } for (auto i: g[a]) { if (i.first != p && i.first != big)dfs(i.first, a, 0); } if (~big) { dfs(big, a, 1), mp[a] = mp[big], vec[a] = vec[big]; } else mp[a] = new map<ll, ll>, vec[a] = new vector<ll>; vec[a]->push_back(a); (*mp[a])[sum[a]] = ((*mp[a])[sum[a]]==0?dep[a]: min(dep[a], (*mp[a])[sum[a]])); map<ll, ll> temp = (*mp[a]); if (temp[kk+sum[a]] != 0)res = min(res, temp[kk+sum[a]]-dep[a]); for (auto i: g[a]) { if (i.first == p || i.first == big)continue; for (auto j: *vec[i.first]) { vec[a]->push_back(j); int h = sum[j]-sum[a]; if ((*mp[a])[sum[j]] == 0)(*mp[a])[sum[j]] = dep[j]; else ((*mp[a])[sum[j]]) = min((*mp[a])[sum[j]], dep[j]); if (kk-h < 0)continue; if (temp[sum[a]+kk-h+sum[a]] == 0)continue; else res = min(res, temp[sum[a]+kk-h+sum[a]]+dep[j]-2*dep[a]); } temp = (*mp[a]); } if (!ok) { for (auto i: *vec[a])(*mp[a])[sum[i]] = 0; } } int best_path(int n, int k, int h[][2], int l[]) { for (int i = 0; i < n; ++i) { g[i].clear(); mp[i] = new map<ll, ll>; vec[i] = new vector<ll>; } dep[0] = 1; kk = k; for (int i = 0; i < n-1; ++i) { g[h[i][0]].push_back({h[i][1], l[i]}); g[h[i][1]].push_back({h[i][0], l[i]}); } res = NN; calc(); dfs(); //cout << endl << res << endl; return (res==NN?-1:res); } //int main() { //int n; cin >> n >> kk; //int h[n][2], l[n]; //for (int i = 0; i < n-1; ++i) { //cin >> h[i][0] >> h[i][1] >> l[i]; //} //cout << best_path(n, kk, h, l); //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...