結果
問題 | No.1718 Random Squirrel |
ユーザー | SSRS |
提出日時 | 2021-10-22 22:04:53 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,016 bytes |
コンパイル時間 | 2,426 ms |
コンパイル使用メモリ | 190,100 KB |
実行使用メモリ | 22,624 KB |
最終ジャッジ日時 | 2024-09-23 05:35:28 |
合計ジャッジ時間 | 7,915 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | WA | - |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | AC | 193 ms
16,132 KB |
testcase_27 | WA | - |
testcase_28 | AC | 192 ms
16,004 KB |
testcase_29 | AC | 219 ms
22,236 KB |
testcase_30 | WA | - |
testcase_31 | AC | 217 ms
22,236 KB |
testcase_32 | AC | 225 ms
22,240 KB |
ソースコード
#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]){ dfs1(c, w); sz[v] += sz[w]; d[w] = d[v] + 1; 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(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; } }