Submission #564128

#TimeUsernameProblemLanguageResultExecution timeMemory
564128tamthegodRace (IOI11_race)C++14
9 / 100
289 ms43304 KiB
#include<iostream> #include<iomanip> #include<algorithm> #include<stack> #include<queue> #include<string> #include<string.h> #include<cmath> #include<vector> #include<map> #include<unordered_map> #include<set> #include<unordered_set> #include<cstdio> #include<bitset> #include<chrono> #include<random> #include<ext/rope> /* ordered_set #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> */ #define pb push_back #define fi first #define se second using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxN = 1e6 + 5; const int mod = 1e9 + 7; const ll oo = 1e18; int n, k; vector<pair<int, int>> adj[maxN]; int depth[maxN], lg[maxN]; int f[maxN][21]; ll dp[maxN]; void Log() { for(int i=2; i<maxN; i++) lg[i] = lg[i / 2] + 1; } void predfs(int u, int par) { for(pair<int, int> a : adj[u]) { int v = a.fi, w = a.se; if(v == par) continue; dp[v] = dp[u] + w; depth[v] = depth[u] + 1; f[v][0] = u; for(int i=1; i<=lg[n]; i++) f[v][i] = f[f[v][i - 1]][i - 1]; predfs(v, u); } } int lca(int u, int v) { if(depth[u] < depth[v]) swap(u, v); int k = depth[u] - depth[v]; for(int i=lg[n]; i>=0; i--) { if(k & (1 << i)) { u = f[u][i]; k -= (1 << i); } } if(u == v) return u; for(int i=lg[n]; i>=0; i--) { if(f[u][i] != f[v][i]) { u = f[u][i]; v = f[v][i]; } } return f[u][0]; } int Kth_Ancestor(int u, int k) { for(int i=lg[n]; i>=0; i--) { if(k & (1 << i)) { u = f[u][i]; k -= (1 << i); } } return u; } ll dist(int u, int v) { return dp[u] + dp[v] - 2 * dp[lca(u, v)]; } ll res = oo; void dfs(int u, int par) { for(pair<int, int> a : adj[u]) { int v = a.fi, w = a.se; if(v == par) continue; dfs(v, u); } ll low = 1, high = depth[u], mid; while(low <= high) { mid = (low + high) / 2; int p = Kth_Ancestor(u, mid); if(dist(u, p) >= k) high = mid - 1; else low = mid + 1; } int p = Kth_Ancestor(u, low); if(dist(u, p) == k) res = min(res, low); } int best_path(int N, int K, int H[][2], int L[2]) { n = N; k = K; for(int i=0; i<n; i++) { H[i][0]++; H[i][1]++; adj[H[i][0]].pb({H[i][1], L[i]}); adj[H[i][1]].pb({H[i][0], L[i]}); } Log(); predfs(1, 0); dfs(1, 0); return res < oo ? res : -1; }

Compilation message (stderr)

race.cpp: In function 'void dfs(int, int)':
race.cpp:103:23: warning: unused variable 'w' [-Wunused-variable]
  103 |         int v = a.fi, w = a.se;
      |                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...