Submission #853978

#TimeUsernameProblemLanguageResultExecution timeMemory
853978Onur_IlgazRace (IOI11_race)C++17
0 / 100
1 ms2396 KiB
#include "race.h" #include <bits/stdc++.h> #define fast cin.tie(0)->sync_with_stdio(0); // #define int long long #define inf ((int)1e18) using namespace std; int ans, k; vector <vector<pair<int, int> > > adj; vector <map<int, int> > mp; vector <int> depth, len; void dfs(int node, int ata) { if(adj[node].size() == 1 and adj[node][0].first == ata) { mp[node].insert({0, 0}); return; } // cerr<<"nodeata: "<<node<<" "<<ata<<"\n"; int mx = 0, mxnode = -1, ww = -1; for(auto &[to, w]:adj[node]) { if(to == ata) continue; dfs(to, node); if((int)mp[to].size() > mx) { mxnode = to; mx = (int)mp[to].size(); ww = w; } } mp[node].swap(mp[mxnode]); // change to depth and valdepth len[node] = len[mxnode] + ww; depth[node] = depth[mxnode] + 1; mp[node].insert({0 - len[node], 0 - depth[node]}); if(mp[node].count(k - len[node])) { ans = min(ans, mp[node][k - len[node]] + depth[node]); } // cerr<<"check "<<node<<" "<<mxnode<<" "<<len[node]<<" "<<depth[node]<<":\n"; for(auto it:mp[node]) { // cerr<<it.first<<" "<<it.second<<"\n"; } for(auto &[to, w]:adj[node]) { if(to == mxnode or to == ata) continue; for(auto it:mp[to]) { int realval = len[to] + it.first + w; int realdepth = depth[to] + it.second + 1; //check if k int need = (k - realval) - len[node]; if(mp[node].count(need)) { // bu yanlışlıkla var olabilir? ans = min(ans, (mp[node][need] + depth[node] + realdepth)); } // add it to map if(mp[node].count(realval - len[node]) ) mp[node].insert({realval - len[node], realdepth - depth[node]}); else mp[node][realval - len[node]] = min(mp[node][realval - len[node]], realdepth - depth[node]); } } } int best_path(int N, int K, int H[][2], int L[]) { ans = inf, k = K; adj.clear(); adj.resize(N + 5); map <int, int> tmp; mp.clear(); mp.assign(N + 5, tmp); // try depth.clear(); depth.resize(N + 5); len.clear(); len.resize(N + 5); for(int i = 0; i < N - 1; i++) { int a = H[i][0], b = H[i][1], w = L[i]; adj[a].push_back({b, w}); adj[b].push_back({a, w}); } dfs(0, -1); return (ans == inf) ? -1 : ans; } // #define MAX_N 500000 // static int N, K; // static int H[MAX_N][2]; // static int L[MAX_N]; // static int solution; // inline // void my_assert(int e) {if (!e) abort();} // void read_input() // { // int i; // my_assert(2==scanf("%lld %lld",&N,&K)); // for(i=0; i<N-1; i++) // my_assert(3==scanf("%lld %lld %lld",&H[i][0],&H[i][1],&L[i])); // my_assert(1==scanf("%lld",&solution)); // } // int32_t main() // { // int ans; // read_input(); // ans = best_path(N,K,H,L); // if(ans==solution) // printf("Correct.\n"); // else // printf("Incorrect. Returned %lld, Expected %lld.\n",ans,solution); // return 0; // }

Compilation message (stderr)

race.cpp: In function 'void dfs(int, int)':
race.cpp:39:14: warning: variable 'it' set but not used [-Wunused-but-set-variable]
   39 |     for(auto it:mp[node]) {
      |              ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...