結果
問題 | No.1718 Random Squirrel |
ユーザー |
![]() |
提出日時 | 2021-10-22 22:09:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 319 ms / 2,000 ms |
コード長 | 3,019 bytes |
コンパイル時間 | 2,183 ms |
コンパイル使用メモリ | 190,276 KB |
実行使用メモリ | 22,744 KB |
最終ジャッジ日時 | 2024-09-23 05:42:27 |
合計ジャッジ時間 | 8,100 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
#include <bits/stdc++.h>using namespace std;struct heavy_light_decomposition{vector<int> p, d, sz, in, next;void dfs1(vector<vector<int>> &c, int v = 0){sz[v] = 1;for (int &w : c[v]){d[w] = d[v] + 1;dfs1(c, w);sz[v] += sz[w];if (sz[w] > sz[c[v][0]]){swap(w, c[v][0]);}}}void dfs2(vector<vector<int>> &c, int &t, int v = 0){in[v] = t;t++;for (int w : c[v]){if (w == c[v][0]){next[w] = next[v];} else {next[w] = w;}dfs2(c, t ,w);}}heavy_light_decomposition(vector<int> &p, vector<vector<int>> &c): p(p){int N = p.size();sz = vector<int>(N, 0);d = vector<int>(N, 0);dfs1(c);in = vector<int>(N, 0);next = vector<int>(N, 0);int t = 0;dfs2(c, t);}int lca(int u, int v){while (true){if (in[u] > in[v]){swap(u, v);}if (next[u] == next[v]){return u;}v = p[next[v]];}}int dist(int u, int v){return d[u] + d[v] - d[lca(u, v)] * 2;}};int main(){int N, K;cin >> N >> K;vector<vector<int>> E(N);for (int i = 0; i < N - 1; i++){int u, v;cin >> u >> v;u--;v--;E[u].push_back(v);E[v].push_back(u);}vector<int> D(K);for (int i = 0; i < K; i++){cin >> D[i];D[i]--;}vector<int> p(N, -1);vector<vector<int>> c(N);queue<int> Q;Q.push(0);vector<int> bfs;while (!Q.empty()){int v = Q.front();Q.pop();bfs.push_back(v);for (int w : E[v]){if (w != p[v]){p[w] = v;c[v].push_back(w);Q.push(w);}}}heavy_light_decomposition T(p, c);vector<pair<int, int>> P(K);for (int i = 0; i < K; i++){P[i] = make_pair(T.in[D[i]], D[i]);}sort(P.begin(), P.end());int S = 0;vector<int> imos(N, 0);for (int i = 0; i < K; i++){int u = P[i].second;int v = P[(i + 1) % K].second;S += T.dist(u, v);imos[u]++;imos[v]++;int w = T.lca(u, v);imos[w]--;if (w > 0){imos[p[w]]--;}}reverse(bfs.begin(), bfs.end());for (int v : bfs){if (v != 0){imos[p[v]] += imos[v];}}vector<int> d1(K);for (int i = 0; i < K; i++){d1[i] = T.dist(D[0], D[i]);}int s = max_element(d1.begin(), d1.end()) - d1.begin();vector<int> d2(K);for (int i = 0; i < K; i++){d2[i] = T.dist(D[s], D[i]);}int t = max_element(d2.begin(), d2.end()) - d2.begin();vector<int> ans(N, -1);for (int i = 0; i < N; i++){if (imos[i] > 0){ans[i] = S - max(T.dist(D[s], i), T.dist(D[t], i));}}queue<int> Q2;for (int i = 0; i < N; i++){if (imos[i] > 0){Q2.push(i);}}while (!Q2.empty()){int v = Q2.front();Q2.pop();for (int w : E[v]){if (ans[w] == -1){ans[w] = ans[v] + 1;Q2.push(w);}}}for (int i = 0; i < N; i++){cout << ans[i] << endl;}}