Submission #115135

#TimeUsernameProblemLanguageResultExecution timeMemory
115135oolimryRace (IOI11_race)C++14
100 / 100
820 ms79552 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; typedef pair<int,int> ii; static vector<ii> adj[200005]; static bool vis[200005]; unordered_map<int,int> dp[200005]; ii offset[200005]; ///values in dp[u] are actually offset[u] more than what is in the maps, first->first, second->second int k; int ans = 102345678; void dfs(int u){ vis[u] = true; for(int i = 0;i < adj[u].size();i++){ int v = adj[u][i].first; int w = adj[u][i].second; if(vis[v]) continue; dfs(v); vector<ii> updates; bool isSwap = false; if(dp[v].size() > dp[u].size()){ isSwap = true; swap(dp[u],dp[v]); swap(offset[u], offset[v]); offset[u].first += w; offset[u].second++; } for(ii x : dp[v]){ int value = x.first + offset[v].first; ///w/o offsets int cost = x.second + offset[v].second; ///w/o offsets if(!isSwap){ value += w; cost++; } //if(i == 0) cout << value << " " << cost << " " << offset[v].second << "\n"; if(value <= k){ if(dp[u].find(k - value - offset[u].first) != dp[u].end()){ ans = min(ans, dp[u][k - value - offset[u].first] + offset[u].second + cost); } updates.push_back({value,cost}); } } dp[v].clear(); for(ii x : updates){ if(dp[u].find(x.first - offset[u].first) == dp[u].end()){ dp[u][x.first - offset[u].first] = x.second - offset[u].second; } else{ dp[u][x.first - offset[u].first] = min(x.second - offset[u].second,dp[u][x.first - offset[u].first]); } } } /* cout << u << " " << offset[u].first << " " << offset[u].second << ": "; for(ii x : dp[u]){ cout << "(" << x.first + offset[u].first << ", " << x.second + offset[u].second << ") "; } cout << "\n"; */ } int best_path(int N, int K, int H[][2], int L[]) { k = K; int n = N; for(int i = 0;i < n;i++) dp[i][0] = 0; for(int i = 0;i < n-1;i++){ int a = H[i][0]; int b = H[i][1]; int c = L[i]; adj[a].push_back({b,c}); adj[b].push_back({a,c}); } dfs(0); if(ans > n) return -1; return ans; }

Compilation message (stderr)

race.cpp: In function 'void dfs(int)':
race.cpp:16:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i < adj[u].size();i++){
                   ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...