Submission #500235

#TimeUsernameProblemLanguageResultExecution timeMemory
500235danikoynovRace (IOI11_race)C++14
100 / 100
2506 ms80636 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn = 2e5 + 10, maxk = 1e6 + 10, inf = 1e9; vector < pair < ll, ll > > g[maxn]; ll lvl[maxn], depth[maxn], sub[maxn]; unordered_map < ll, ll > mp, vis; void pre_dfs(ll v, ll par) { sub[v] = 1; for (ll i = 0; i < g[v].size(); i ++) { ll u = g[v][i].first; if (u == par) continue; lvl[u] = lvl[v] + 1; depth[u] = depth[v] + g[v][i].second; pre_dfs(u, v); sub[v] += sub[u]; } } ll cnt[maxk], ans, k; void check_dfs(ll v, ll p, ll root) { ll len = (k + depth[root]) - depth[v] + depth[root]; ///cout << depth[v] << " " << depth[root] << " " << len << endl; if (vis[len]) { ans = min(ans, lvl[v] - lvl[root] + mp[len] - lvl[root]); ///cout << lvl[v] << " - " << lvl[root] << " - " << mp[len] << endl; } for (ll i = 0; i < g[v].size(); i ++) { ll u = g[v][i].first; if (u == p) continue; check_dfs(u, v, root); } } vector < ll > path; void add_dfs(ll v, ll p, ll root) { ll len = depth[v]; if (vis[len]) mp[len] = min(mp[len], lvl[v]); else { vis[len] = 1; mp[len] = lvl[v]; } for (ll i = 0; i < g[v].size(); i ++) { ll u = g[v][i].first; if (u == p) continue; add_dfs(u, v, root); } } void dfs(ll v, ll p, bool big, ll last_depth) { ll mx = -1, new_depth = 0; for (ll i = 0; i < g[v].size(); i ++) { ll u = g[v][i].first; if (u == p) continue; if (mx == -1 || sub[u] > sub[mx]) mx = u, new_depth = depth[u] - depth[v]; } for (ll i = 0; i < g[v].size(); i ++) { ll u = g[v][i].first; if (u == p || u == mx) continue; dfs(u, v, false, 0); } if (mx != -1) { dfs(mx, v, true, new_depth); } vis[depth[v]] = 1; mp[depth[v]] = lvl[v]; if (vis[depth[v] + k]) ans = min(ans, mp[depth[v] + k] - lvl[v]); for (ll i = 0; i < g[v].size(); i ++) { ll u = g[v][i].first; if (u == p || u == mx) continue; check_dfs(u, v, v); add_dfs(u, v, v); } /**cout << v << endl; for (ll i = 0; i <= k; i ++) cout << cnt[i] << " "; cout << endl;*/ if (!big) { vis.clear(); mp.clear(); } } int best_path(int N, int K, int H[][2], int L[]) { k = K; for (ll 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]}); } pre_dfs(0, -1); for (ll i = 0; i <= K; i ++) cnt[i] = inf; ans = inf; dfs(0, -1, 1, 0); if (ans == inf) return -1; return ans; }

Compilation message (stderr)

race.cpp: In function 'void pre_dfs(ll, ll)':
race.cpp:13:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |     for (ll i = 0; i < g[v].size(); i ++)
      |                    ~~^~~~~~~~~~~~~
race.cpp: In function 'void check_dfs(ll, ll, ll)':
race.cpp:35:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     for (ll i = 0; i < g[v].size(); i ++)
      |                    ~~^~~~~~~~~~~~~
race.cpp: In function 'void add_dfs(ll, ll, ll)':
race.cpp:55:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for (ll i = 0; i < g[v].size(); i ++)
      |                    ~~^~~~~~~~~~~~~
race.cpp: In function 'void dfs(ll, ll, bool, ll)':
race.cpp:66:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for (ll i = 0; i < g[v].size(); i ++)
      |                    ~~^~~~~~~~~~~~~
race.cpp:75:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |     for (ll i = 0; i < g[v].size(); i ++)
      |                    ~~^~~~~~~~~~~~~
race.cpp:93:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |     for (ll i = 0; i < g[v].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...