Submission #1285394

#TimeUsernameProblemLanguageResultExecution timeMemory
1285394sundryyarn꿈 (IOI13_dreaming)C++17
0 / 100
39 ms7448 KiB
#include "dreaming.h" #include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace std; typedef pair<int, int> pi; inline vector<int> getTreeDiameters(const vector<vector<pi>>& g) { const int N = g.size(); vector<bool> visited(N, false); const auto getFurthest = [&](const int start, vector<int>& dist) -> int { int result = start; queue<int> q({start}); visited[start] = true; while (! q.empty()) { const int u = q.front(); q.pop(); for (const pi& p : g[u]) if (! visited[p.second]) { q.push(p.second); visited[p.second] = true; dist[p.second] = dist[u] + p.first; // cout << u << " -> " << p.second << ", dist " << dist[u] << " -> " << dist[p.second] << endl; if (dist[result] < dist[p.second]) result = p.second; } } return result; }; const auto getMinDist = [&](const int start, const vector<int>& du, const vector<int>& dv) -> int { int result = max(du[start], dv[start]); queue<int> q({start}); visited[start] = true; while (! q.empty()) { const int u = q.front(); q.pop(); for (const pi& p : g[u]) if (! visited[p.second]) { q.push(p.second); visited[p.second] = true; result = min(result, max(du[p.second], dv[p.second])); } } return result; }; vector<int> tree_u, tree_v, d_(N, 0), du(N, 0), dv(N, 0); for (int i = 0; i < N; i ++) if (! visited[i]) tree_u.push_back(getFurthest(i, d_)); // cout << "then for u, \n"; visited = vector<bool>(N, 0); for (const int& u : tree_u) tree_v.push_back(getFurthest(u, du)); if (tree_u.size() == 1) return {*max(du.begin(), du.end())}; // cout << "then for v, \n"; visited = vector<bool>(N, 0); for (const int& v : tree_v) getFurthest(v, dv); vector<int> result; visited = vector<bool>(N, 0); for (const int& u : tree_u) result.push_back(getMinDist(u, du, dv)); sort(result.rbegin(), result.rend()); return result; } inline int getArrangedTime(const vector<int>& tree, const int& L) { cout << "tree: "; for (const int& p : tree) cout << p << " "; cout << endl; if (tree.size() == 1) return tree[0]; int u = 0, v = 1, N = tree.size(), p[N], left = 100000, right = 100002; p[0] = 100001; p[1] = 100002; const auto distance = [&](const int& a, const int& b, const int& pa, const int& pb) -> int { return tree[a] + tree[b] + L * abs(pa - pb); }; int cur = distance(u, v, p[u], p[v]); for (int i = 2; i < tree.size(); i ++) { const int left_dist = max(distance(u, i, p[u], left), distance(v, i, p[v], left)), right_dist = max(distance(u, i, p[u], right), distance(v, i, p[v], right)); if (left_dist < right_dist) { p[i] = left --; cur = max(cur, left_dist); } else { p[i] = right ++; cur = max(cur, right_dist); } } return cur; } int travelTime(int N,int M,int L,int A[],int B[],int T[]) { vector<vector<pi>> g(N); for (int i = 0; i < M; i ++) { g[A[i]].push_back(make_pair(T[i], B[i])); g[B[i]].push_back(make_pair(T[i], A[i])); } return getArrangedTime(getTreeDiameters(g), L); } // int main() // { // int N = 12, M = 8, L = 2, // A[8] = {0,8,2,5,5,1,1,10}, // B[8] = {8,2,7,11,1,3,9,6}, // C[8] = {4,2,4,3,7,1,5,3}; // cout << travelTime(N, M, L, A, B, C); // return 0; // }
#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...