Submission #123030

#TimeUsernameProblemLanguageResultExecution timeMemory
123030MAMBADreaming (IOI13_dreaming)C++17
100 / 100
132 ms18680 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; #define pb push_back #define all(x) x.begin(), x.end() #define rep(i , j , k) for (int i = j; i < (int)k; i++) typedef vector<int> vi; constexpr int MAXN = 1e5 + 10; inline bool smin(int &l, int r) { if (r < l) return l = r , true; return false; } inline bool smax(int &l, int r) { if (l < r) return l = r, true; return false; } vi adj[MAXN]; int res, pd[MAXN], dpU[MAXN], dpD[MAXN]; int a[MAXN], b[MAXN], t[MAXN]; void dfsD(int v, int par = -1) { dpD[v] = 0; for (auto e : adj[v]) { int u = a[e] ^ b[e] ^ v; if (u ^ par) { dfsD(u , v); smax(dpD[v] , dpD[u] + t[e]); } } } void dfsU(int v, int& root, int par = -1) { pd[v] = max(dpD[v] , dpU[v]); if (pd[v] < pd[root]) root = v; smax(res , pd[v]); auto solve = [&]() { int worst = dpU[v]; for (auto e : adj[v]) { int u = a[e] ^ b[e] ^ v; if (u ^ par) { smax(dpU[u] , worst + t[e]); smax(worst , dpD[u] + t[e]); } } }; solve(); reverse(all(adj[v])); solve(); for (auto e :adj[v]) { int u = a[e] ^ b[e] ^ v; if (u ^ par) dfsU(u , root , v); } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { rep(i , 0 , N) adj[i].clear(); rep(i , 0 , M) { tie(a[i] , b[i] , t[i]) = make_tuple(A[i] ,B[i] ,T[i]); adj[A[i]].pb(i); adj[B[i]].pb(i); } memset(pd , 0 , sizeof(pd)); memset(dpU , 0 , sizeof(dpU)); memset(dpD , 0 , sizeof(dpD)); res = 0; vi vec; rep(i , 0 , N) if (!pd[i]) { int root = i; dfsD(i); dfsU(i , root); vec.pb(root); } sort(all(vec) , [](int l , int r) { return pd[l] > pd[r]; }); int lres = 1e9; int g = min(3 , (int)vec.size()); rep(i , 0 , g) { int worst = 0; rep(j , 0 , g) if (i ^ j) { smax(worst , pd[vec[i]] + pd[vec[j]] + L); rep(z , 0 , g) if (z ^ i && z ^ j) smax(worst , pd[vec[z]] + pd[vec[j]] + 2 * L); } smin(lres , worst); } return max(lres , res); }
#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...