Submission #564162

#TimeUsernameProblemLanguageResultExecution timeMemory
564162tamthegodRace (IOI11_race)C++14
0 / 100
34 ms74664 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 vis[maxN], parCent[maxN], dp[maxN]; int depth[maxN], lg[maxN]; int f[maxN][21]; ll d[maxN]; map<ll, ll> mp[maxN]; ll res = oo; 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; d[v] = d[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]; } ll dist(int u, int v) { return d[u] + d[v] - 2 * d[lca(u, v)]; } ll Dist(int u, int v) { return depth[u] + depth[v] - 2 * depth[lca(u, v)]; } int dfs(int u, int par) { dp[u] = 1; for(pair<int, int> a : adj[u]) { int v = a.fi; if(v == par || vis[v]) continue; dp[u] += dfs(v, u); } return dp[u]; } int Find_Centroid(int u, int par, int sz) { for(pair<int, int> a : adj[u]) { int v = a.fi; if(v == par || vis[v]) continue; if(dp[v] > sz / 2) return Find_Centroid(v, u, sz); } return u; } int Decompose(int u) { int root = Find_Centroid(u, 0, dfs(u, 0)); vis[root] = 1; for(pair<int, int> a : adj[root]) { int v = a.fi; if(vis[v]) continue; parCent[Decompose(v)] = root; } return root; } void update(int u) { for(int v=u; v; v=parCent[v]) { if(mp[v][k - dist(u, v)]) res = min(res, mp[v][k - dist(u, v)] + Dist(u, v)); mp[v][dist(u, v)] = min(mp[v][dist(u, v)], Dist(u, v)); } } 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); Decompose(1); for(int i=1; i<=n; i++) update(i); return res < oo ? res : -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...