Submission #1231398

#TimeUsernameProblemLanguageResultExecution timeMemory
1231398rhm_ganDreaming (IOI13_dreaming)C++20
0 / 100
301 ms68596 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; const int N = 1e5; struct Graph { int n; vector<vector<pair<int, int>>> g; vector<int> dp1, dp2, res; vector<array<int, 3>> edges; map<int, int> m, rev; int cnt; Graph() { cnt = 0; } void add(int a, int b, int w) { m[a] = m[b] = 1; edges.push_back({a, b, w}); cnt++; } void compress() { int k = 0; for (auto [x, c] : m) { m[x] = k; rev[k] = x; k++; } n = k; g.resize(n); dp1.resize(n); dp2.resize(n); res.resize(n); for (auto [a, b, w] : edges) { a = m[a]; b = m[b]; g[a].push_back({b, w}); g[b].push_back({a, w}); } } void dfs1(int u, int p) { for (auto [v, w] : g[u]) { if (v == p) continue; dfs1(v, u); if (dp1[v] + w >= dp1[u]) { dp2[u] = dp1[u]; dp1[u] = dp1[v] + w; } else { dp2[u] = max(dp2[u], dp1[v] + w); } } res[u] = max(res[u], dp1[u]); } void dfs2(int u, int p, int d) { res[u] = max(res[u], d); for (auto [v, w] : g[u]) { if (v == p) continue; int k = 0; if (dp1[v] + w == dp1[u]) { k = dp2[u]; } else { k = dp1[u]; } dfs2(v, u, max(k, d) + w); } } int findmin() { compress(); dfs1(0, -1); dfs2(0, -1, 0); int mn = 1e9; for (int i = 0; i < n; i++) { if (res[i] != 0) { mn = min(mn, res[i]); } } for (int i = 0; i < n; i++) { if (res[i] == mn) { return rev[i]; } } return -1; } bool empty() { return cnt == 0; } void clear() { g.clear(); dp1.clear(); dp2.clear(); res.clear(); m.clear(); rev.clear(); cnt = n = 0; } }; vector<pair<int, int>> adj[N]; Graph g[N]; bool vis[N]; void dfs(int u, int id) { vis[u] = 1; for (auto [v, w] : adj[u]) { if (!vis[v]) { g[id].add(u, v, w); dfs(v, id); } } } int travelTime(int n, int m, int l, int a[], int b[], int t[]) { Graph res; vector<bool> is(n); for (int i = 0; i < m; i++) { int u = a[i], v = b[i], w = t[i]; is[u] = is[v] = 1; adj[u].push_back({v, w}); adj[v].push_back({u, w}); res.add(u, v, w); } int M = 0; for (int i = 0; i < n; i++) { if (!vis[i]) { dfs(i, M++); } } vector<int> v; for (int i = 0; i < n; i++) { if (!is[i]) { v.push_back(i); } } for (int i = 0; i < N; i++) { if (!g[i].empty()) { v.push_back(g[i].findmin()); } } for (int i = 1; i < v.size(); i++) { res.add(v[i], v[i - 1], l); } int id = res.findmin(); int ans = 0; for (int i = 0; i < N; i++) { ans = max(ans, res.res[i]); } return ans; }
#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...