Submission #68040
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | #include <bits/stdc++.h> using namespace std; template < typename Graph> struct Doubling { public : int n, lg; const Graph g; vector< int > depth; vector<vector< int > > table, dist_table; vector< int > dist; Doubling(Graph &G) : g(G), n(G.size()), depth(G.size()), dist(G.size()) { lg = 32 - __builtin_clz(n) + 1; table.resize(n, vector(lg, 0)); dist_table.resize(n, vector(lg, 0)); dfs(0, -1, 0, 0); build(); } int lca( int u, int v) { if (depth[u] < depth[v]) swap(u, v); for ( int k = lg - 1; k >= 0; --k) { if (depth[u] - depth[v] >> k & 1) u = table[u][k]; } if (u == v) return (u); for ( int k = lg - 1; k >= 0; --k) { if (table[u][k] != table[v][k]) { u = table[u][k]; v = table[v][k]; } } return (table[u][0]); } /* dep[u] < dep[v] */ int binary_search( int u, int v, int all) { int sum = 0; for ( int k = lg - 1; k >= 0; --k) { if (depth[v] - depth[u] >= 1 << k && (sum + dist_table[v][k]) * 2 < all) { sum += dist_table[v][k]; v = table[v][k]; } } return (v); } int la( int u, int x) { for ( int k = lg - 1; k >= 0; --k) { if (x >> k & 1) { u = table[u][k]; x >>= 1; } } return (u); } int distance( int u, int v) { return (dist[u] + dist[v] - dist[lca(u, v)] * 2); } private : void build() { for ( int k = 0; k < lg - 1; ++k) { for ( int i = 0; i < n; ++i) { if (table[i][k] != -1) { table[i][k + 1] = table[table[i][k]][k]; dist_table[i][k + 1] = dist_table[i][k] + dist_table[table[i][k]][k]; } } } } void dfs( int cur, int par, int dep, int dis) { depth[cur] = dep; table[cur][0] = par; dist[cur] = dis; for (auto [to, w] : g[cur]) { if (par == to) continue ; dist_table[to][0] = w; dfs(to, cur, dep + 1, dis + w); } } }; int main() { cin.tie(nullptr); ios_base::sync_with_stdio( false ); int n, q; cin >> n >> q; vector<vector<pair< int , int > > > graph(n); for ( int i = 0; i < n - 1; ++i) { int u, v, w; cin >> u >> v >> w; --u, --v; graph[u].emplace_back(v, w); graph[v].emplace_back(u, w); } Doubling dbl(graph); for ( int i = 0; i < q; ++i) { int a, b, c; cin >> a >> b >> c; --a, --b, --c; int dist_ab = dbl.distance(a, b); int dist_ac = dbl.distance(a, c); int dist_bc = dbl.distance(b, c); int max_dist = max({dist_ab, dist_ac, dist_bc}); int u, v; if (dist_ab == max_dist) u = a, v = b; if (dist_ac == max_dist) u = a, v = c; if (dist_bc == max_dist) u = b, v = c; int lca = dbl.lca(u, v), dist = max_dist; if (dbl.depth[u] > dbl.depth[v]) swap(u, v); if (lca != u) { if (dbl.distance(u, lca) > dbl.distance(lca, v)) swap(u, v); u = lca; } // cout << u << ' ' << v << ' ' << dist << '\n'; int x = dbl.binary_search(u, v, dist); int y = max(dbl.la(x, 1), 0); // cout << x << ' ' << y << '\n'; cout << min(max({dbl.distance(a, x), dbl.distance(b, x), dbl.distance(c, x)}), max({dbl.distance(a, y), dbl.distance(b, y), dbl.distance(c, y)})) << '\n' ; } return (0); } |
ステータス
項目 | データ |
---|---|
問題 | 1024 - 待ち合わせ |
ユーザー名 | ei1903 |
投稿日時 | 2021-08-11 11:05:44 |
言語 | C++17 |
状態 | Accepted |
得点 | 14 |
ソースコード長 | 3818 Byte |
最大実行時間 | 521 ms |
最大メモリ使用量 | 45792 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 14 / 14 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in1.txt | AC | 28 ms | 600 KB |
1
|
in2.txt | AC | 29 ms | 640 KB |
1
|
in3.txt | AC | 17 ms | 632 KB |
1
|
in4.txt | AC | 25 ms | 2756 KB |
1
|
in5.txt | AC | 19 ms | 7420 KB |
1
|
in6.txt | AC | 27 ms | 12268 KB |
1
|
in7.txt | AC | 24 ms | 12348 KB |
1
|
in8.txt | AC | 22 ms | 12300 KB |
1
|
in9.txt | AC | 20 ms | 12372 KB |
1
|
in10.txt | AC | 29 ms | 420 KB |
1
|
in11.txt | AC | 22 ms | 620 KB |
1
|
in12.txt | AC | 21 ms | 572 KB |
1
|
in13.txt | AC | 17 ms | 528 KB |
1
|
in14.txt | AC | 28 ms | 484 KB |
1
|
in15.txt | AC | 30 ms | 556 KB |
1
|
in16.txt | AC | 20 ms | 628 KB |
1
|
in17.txt | AC | 21 ms | 572 KB |
1
|
in18.txt | AC | 24 ms | 640 KB |
1
|
in19.txt | AC | 18 ms | 580 KB |
1
|
in20.txt | AC | 18 ms | 596 KB |
1
|
in21.txt | AC | 20 ms | 660 KB |
1
|
in22.txt | AC | 15 ms | 592 KB |
1
|
in23.txt | AC | 18 ms | 652 KB |
1
|
in24.txt | AC | 22 ms | 712 KB |
1
|
in25.txt | AC | 16 ms | 648 KB |
1
|
in26.txt | AC | 21 ms | 704 KB |
1
|
in27.txt | AC | 26 ms | 752 KB |
1
|
in28.txt | AC | 25 ms | 668 KB |
1
|
in29.txt | AC | 24 ms | 716 KB |
1
|
in30.txt | AC | 15 ms | 716 KB |
1
|
in31.txt | AC | 20 ms | 764 KB |
1
|
in32.txt | AC | 22 ms | 680 KB |
1
|
in33.txt | AC | 21 ms | 592 KB |
1
|
in34.txt | AC | 20 ms | 636 KB |
1
|
in35.txt | AC | 21 ms | 812 KB |
1
|
in36.txt | AC | 494 ms | 41180 KB |
1
|
in37.txt | AC | 219 ms | 32392 KB |
1
|
in38.txt | AC | 229 ms | 29144 KB |
1
|
in39.txt | AC | 242 ms | 35412 KB |
1
|
in40.txt | AC | 239 ms | 30612 KB |
1
|
in41.txt | AC | 232 ms | 32300 KB |
1
|
in42.txt | AC | 158 ms | 35056 KB |
1
|
in43.txt | AC | 174 ms | 31156 KB |
1
|
in44.txt | AC | 219 ms | 31376 KB |
1
|
in45.txt | AC | 215 ms | 37888 KB |
1
|
in46.txt | AC | 232 ms | 37676 KB |
1
|
in47.txt | AC | 309 ms | 36048 KB |
1
|
in48.txt | AC | 393 ms | 38468 KB |
1
|
in49.txt | AC | 336 ms | 37704 KB |
1
|
in50.txt | AC | 363 ms | 37452 KB |
1
|
in51.txt | AC | 399 ms | 40132 KB |
1
|
in52.txt | AC | 391 ms | 42864 KB |
1
|
in53.txt | AC | 465 ms | 45340 KB |
1
|
in54.txt | AC | 447 ms | 43356 KB |
1
|
in55.txt | AC | 521 ms | 45500 KB |
1
|
in56.txt | AC | 467 ms | 45792 KB |
1
|