Submission #72335

#TimeUsernameProblemLanguageResultExecution timeMemory
72335nvmdavaDreaming (IOI13_dreaming)C++17
100 / 100
280 ms34152 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; struct Path{ int to, cost; Path(int _to, int _cost){ to = _to; cost = _cost; } }; struct Node{ int p[20], d; }; map<int, int> c[100001]; vector<Path> path[100001]; bool in[100001]; Node a[100001]; int mxdist, mxid; int solo = 0; void build(int v, int p){ in[v] = 1; for(auto x : path[v]){ if(x.to == p) continue; a[x.to].d = a[v].d + 1; memset(a[x.to].p, -1, sizeof(a[x.to].p)); a[x.to].p[0] = v; for(int i = 1; i < 20; i++){ int t = a[x.to].p[i - 1]; if(t == -1) break; a[x.to].p[i] = a[t].p[i - 1]; } build(x.to, v); } } int goUp(int v, int u){ for(int i = 0; i < 20; i++){ if(u & (1 << i)) v = a[v].p[i]; } return v; } int lca(int v, int u){ int l = 0; int r = min(a[v].d, a[u].d) + 1; int m; while(l + 1 != r){ m = (l + r) >> 1; if(goUp(v, a[v].d - m) == goUp(u, a[u].d - m)) l = m; else r = m; } return goUp(v, a[v].d - l); } void dfs(int v, int p, int d){ if(path[v].size() == 1 && p != -1){ if(d > mxdist){ mxdist = d; mxid = v; } } for(auto x : path[v]){ if(x.to == p) continue; dfs(x.to, v, d + x.cost); } } int comp = 0; int go(int v){ if(in[v]) return 0; comp++; if(path[v].size() == 0) return 0; memset(a[v].p, -1, sizeof(a[v].p)); a[v].d = 0; build(v, -1); mxdist = 0; mxid = v; dfs(v, -1, 0); mxdist = 0; v = mxid; dfs(v, -1, 0); int u = mxid; int o = lca(v, u); solo = max(solo, mxdist); int s = (mxdist + 1) >> 1; int q = 0; while(v != o){ q += c[v][a[v].p[0]]; if(q >= s){ return min(q, mxdist - q + c[v][a[v].p[0]]); } v = a[v].p[0]; } q = 0; while(u != o){ q += c[u][a[u].p[0]]; if(q >= s){ return min(q, mxdist - q + c[u][a[u].p[0]]); } u = a[u].p[0]; } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { for(int i = 0; i < M; i++){ path[A[i]].push_back(Path(B[i], T[i])); path[B[i]].push_back(Path(A[i], T[i])); c[A[i]][B[i]] = T[i]; c[B[i]][A[i]] = T[i]; } int mx = 0; int mx2 = 0; int mx3 = 0; int s; for(int i = 0; i < N; i++){ s = go(i); if(s > mx){ mx3 = mx2; mx2 = mx; mx = s; } else if(s > mx2){ mx3 = mx2; mx2 = s; } else { mx3 = max(mx3, s); } } if(comp == 1) return solo; if(comp == 2) return max(solo, L + mx + mx2); return max(L + mx + mx2, max(solo, mx3 + mx2 + L * 2)); }

Compilation message (stderr)

dreaming.cpp: In function 'int go(int)':
dreaming.cpp:106:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...